source("labels_screws_functions.R", local = TRUE)
left_rod_df %>%
  as_tibble() %>%
  arrange(V2) %>%
  as.matrix()
             V1        V2
 [1,] 0.5264916 0.5034615 0.1956699
 [3,] 0.4511795 0.2193301
 [4,] 0.4509162 0.2485389
 [5,] 0.4511721 0.2783970
 [6,] 0.4500000 0.3150000
 [7,] 0.4550000 0.3550000
 [8,] 0.4546403
 [9,] 0.4544356 0.4214511
[10,] 0.4544356 0.4564511
[11,] 0.4932379
[12,] 0.4600000 0.5300000
[13,] 0.4600000 0.5650000
[14,] 0.4600000 0.5950000
[15,] 0.6267241
[16,] 0.4611721 0.6583970
[17,] 0.4611721 0.6883970
[18,] 0.7133970
[19,] 0.4611721 0.7383970
[20,] 0.4611721 0.7633970
[21,] 0.4778349 0.7870897
[22,] 0.4581721 0.4778349 0.8040897
[24,] 0.8210897
[25,] 0.4778349
[26,] 0.4692306 0.8564581
[27,] 0.4645770 0.8643989
[28,] 0.4699970 0.8809878
[29,] 0.4725000 0.9070000

ILIAC

left_rod_df
           [,1]      [,2]
 [1,] 0.4725000 0.9070000
 [2,] 0.4699970 0.8809878
 [3,] 0.4645770 0.8643989
 [4,] 0.4692306 0.8564581
 [5,] 0.4778349
 [6,] 0.4778349 0.8210897
 [7,] 0.4778349 0.8040897 0.4778349 0.7870897 0.4581721 0.4611721 0.7633970
[11,] 0.4611721 0.7383970 0.4611721 0.7133970
[13,] 0.4611721 0.6883970
[14,] 0.6583970
[15,] 0.4605119 0.6267241
[16,] 0.4600000 0.5650000
[18,] 0.5300000
[19,] 0.4546403 0.4564511
[21,] 0.4544356 0.4214511 0.4546403 0.3832379
[23,] 0.4550000 0.3550000
[24,] 0.4500000 0.3150000
[25,] 0.4511721
[26,] 0.4509162 0.2485389
[27,] 0.4511795
[28,] 0.4444615
[29,] 0.4664916 0.1608256

RODS

ggdraw() +
      draw_image(spine_png, scale = 1, y = 0, valign = 0, x = 0, width = 1) +
      draw_text(text = labels_df$labels, x = labels_df$x_left, y = labels_df$y, size = 12, fontface = "bold") +
      draw_text(text = labels_df$labels, x = labels_df$x_right, y = labels_df$y, size = 12, fontface = "bold") +
      geom_point(aes(x = 0.5 - iliac_x_offset, y = iliac_y), size = 4) + 
  geom_point(aes(x = 0.5 - s2ai_x_offset, y = s2ai_y), size = 4) + 
  geom_sf(data = l2_upgoing_hooks_collection) +
  ggpattern::geom_sf_pattern(data = s2ai_screw_screwhead$left_screw_sf, pattern = "stripe",  pattern_fill = "red",alpha = 0.8, pattern_colour = "blue", pattern_density = 0.01, pattern_spacing = 0.003, angle = 70) +
  ggpattern::geom_sf_pattern(data = s2ai_screw_screwhead$right_screw_sf, pattern = "stripe",  pattern_fill = "red",alpha = 0.8, pattern_colour = "blue", pattern_density = 0.01, pattern_spacing = 0.003, angle = 70) +
  theme_minimal_grid()  +
  ylim(0, 0.5)
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
Ignoring unknown parameters: angleIgnoring unknown parameters: angleScale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.

ggdraw() +
      draw_image(spine_png, scale = 1, y = 0, valign = 0, x = 0, width = 1) +
      draw_text(text = labels_df$labels, x = labels_df$x_left, y = labels_df$y, size = 12, fontface = "bold") +
      draw_text(text = labels_df$labels, x = labels_df$x_right, y = labels_df$y, size = 12, fontface = "bold") +
      geom_point(aes(x = 0.5 - iliac_x_offset, y = iliac_y), size = 4) + 
  geom_point(aes(x = 0.5 - s2ai_x_offset, y = s2ai_y), size = 4) + 
  geom_sf(data = pedicle_hooks_collection) +
  ggpattern::geom_sf_pattern(data = s2ai_screw_screwhead$left_screw_sf, pattern = "stripe",  pattern_fill = "red",alpha = 0.8, pattern_colour = "blue", pattern_density = 0.01, pattern_spacing = 0.003, angle = 70) +
  ggpattern::geom_sf_pattern(data = s2ai_screw_screwhead$right_screw_sf, pattern = "stripe",  pattern_fill = "red",alpha = 0.8, pattern_colour = "blue", pattern_density = 0.01, pattern_spacing = 0.003, angle = 70) +
  theme_minimal_grid() 
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
Ignoring unknown parameters: angle

GET PEDICLE Y values


xy_lines <- tibble(x_left = 0.45, x_right = 0.55, y = seq(from = 0, to = 1, by = 0.01))

xy_lines

ggdraw() +
      draw_image(spine_png, scale = 1, y = 0, valign = 0, x = 0, width = 1) +
      draw_text(text = labels_df$labels, x = labels_df$x_left, y = labels_df$y, size = 12, fontface = "bold") +
      draw_text(text = labels_df$labels, x = labels_df$x_right, y = labels_df$y, size = 12, fontface = "bold") +
      geom_point(aes(x = 0.5 - iliac_x_offset, y = iliac_y), size = 4) + 
  geom_linerange(data = xy_lines, aes(xmin = x_left, xmax = x_right, y = y, color = y)) +
  draw_text(text = xy_lines$y, x = xy_lines$x_left - 0.05, y = xy_lines$y, size = 7) +
  # geom_text(data = xy_lines,  aes())
  geom_sf(data = pedicle_hooks_collection) +
  ggpattern::geom_sf_pattern(data = s2ai_screw_screwhead$left_screw_sf, pattern = "stripe",  pattern_fill = "red",alpha = 0.8, pattern_colour = "blue", pattern_density = 0.01, pattern_spacing = 0.003, angle = 70) +
  ggpattern::geom_sf_pattern(data = s2ai_screw_screwhead$right_screw_sf, pattern = "stripe",  pattern_fill = "red",alpha = 0.8, pattern_colour = "blue", pattern_density = 0.01, pattern_spacing = 0.003, angle = 70) +
  theme_minimal_grid() +
  ylim(0, 0.5)
  
  

read in coordinates csv’s

tp_hooks_df <- tp_hooks_list_df %>%
  left_join(tp_hook_heads_list_df)
Joining, by = c("level", "side", "implant_type")
l3_pedicle_y
Error: object 'l3_pedicle_y' not found
implant_starts_df %>%
  tabyl(implant)
            implant  n    percent
 lateral_mass_screw 12
         pars_screw  2 0.01315789
      pedicle_screw 48       pelvic_screw 0.05263158
            tp_hook 34 0.22368421
 translaminar_screw 48 0.31578947
tabyl(implant_starts_df$implant)
 implant_starts_df$implant  n
    laminar_downgoing_hook   0.192
      laminar_upgoing_hook 48   0.192
        lateral_mass_screw 12   0.048
            occiptal_screw  2   0.008
                pars_screw  2   0.008
             pedicle_screw 48   0.192              pelvic_screw  8   0.032
                   tp_hook 34   0.136
        translaminar_screw 48
right_vector
[1] "L1_right_pedicle_screw" "no_screw"               "L5_right_pedicle_screw"
 ggdraw() +
  draw_image(image = spine_png, x = 0, y = 0, width = 1, valign = 0, clip = "off") + 
                   ggpattern::geom_sf_pattern(
                    data = decompression_levels_sf,
                    pattern = "stripe",
                    pattern_fill = "grey",
                    alpha = 0.8,
                    pattern_colour = "red",
                    pattern_density = 0.02,
                    pattern_spacing = 0.1
                   )
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

#pedicle hooks
implant_starts_df %>%
  filter(implant == "pedicle_screw")

build_pedicle_hook_function <- function(x_start, y_start){
  
  y_lenth <- 0.01
  
  x_width <- 0.012
  
  if(x_start < 0.5){
    start <- c(x_start, y_start)
    
    point_2 <- c(start[1], start[2] - y_lenth)
    
    point_3 <- c(start[1] + x_width*0.5, start[2] - y_lenth)
    
    point_5 <- point_3
    
    point_6 <- c(point_2[1] + x_width, point_2[2])
    
    
    
    hook_sf <- st_buffer(hook, dist = 0.002, endCapStyle = "ROUND")
  
    if(x_start > 0.5){
    start <- c(x_start, y_start)
    
    point_2 <- c(start[1], start[2] - y_lenth)
    
    point_3 <- c(start[1] - x_width*0.5, start[2] - y_lenth)
    
    
    point_5 <- point_3
    
    point_6 <- c(point_2[1] - x_width, point_2[2])
    point_7 <- c(point_6[1], point_6[2] + y_lenth*0.75)
    
    hook <- st_linestring(rbind(start, point_3, point_4, point_5, point_6, point_7))
    
  
  return(hook_sf)

}

implant_starts_df %>%
  filter(implant == "pedicle_hook")

pedicle_hook_df <- implant_starts_df %>%
  filter(implant == "pedicle_hook") %>%
  mutate(hook = pmap(list(..1 = x,
                          ..2 = y), .f = ~build_pedicle_hook_function(x_start = ..1, y_start = ..2)))

# osteotomies_sf <- st_multilinestring(osteotomy_df$grade_1)

hook_sf <- st_multipolygon(pedicle_hook_df$hook)

 ggdraw() +
  draw_image(image = spine_png, x = 0, y = 0, width = 1, valign = 0, clip = "on") + 
   geom_sf(data = hook_sf, color = "red")
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

 ggdraw() +
  draw_image(image = spine_png, x = 0, y = 0, width = 1, valign = 0, clip = "on") + 
   # geom_sf(data = sublaminar_band_sf, color = "red") +
   # geom_sf(data = st_union(x =con_b, y = sub_b)) +
   geom_sf(data = sublaminar_band_sf) +
   # geom_sf(data = sub_b) +
   ylim(0.3, 0.9)
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.

 ggdraw() +
  draw_image(image = spine_png, x = 0, y = 0, width = 1, valign = 0, clip = "on") + 
   geom_sf(data = all_implants_sf, color = "red")
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHtyfQ0KDQpzb3VyY2UoImxhYmVsc19zY3Jld3NfZnVuY3Rpb25zLlIiLCBsb2NhbCA9IFRSVUUpDQpgYGANCg0KDQpgYGB7cn0NCnNjcmV3X3NjcmV3aGVhZF9sb25nX2RmDQoNCnNjcmV3X3N0YXJ0X2RmDQoNCnN0cmluZyA8LSBnbHVlKGNhdChzY3Jld19zdGFydF9kZiRzaWRlKSkNCg0KbWFwKHNjcmV3X3N0YXJ0X2RmJHNpZGUsIC5mID0gY2F0KVsxXQ0KDQpwYXN0ZShzY3Jld19zdGFydF9kZiRzaWRlLCBzZXA9IiIsIGNvbGxhcHNlPSIiKSANCg0KDQptaW4oc3RfYm91bmRhcnkoYzNfbG1fc2NyZXdfc2NyZXdoZWFkJGxlZnRfc2NyZXdfc2YpKQ0KDQpzdW1tYXJ5KGMzX2xtX3NjcmV3X3NjcmV3aGVhZCRsZWZ0X3NjcmV3X3NmKQ0KDQpzdF9uZWFyZXN0X3BvaW50cyhzY3Jld19saXN0KQ0KDQpsZWZ0X3NjcmV3aGVhZF9wb2ludF8xIDwtIGM0X2xtX3NjcmV3X3NjcmV3aGVhZCRsZWZ0X3NjcmV3X3JvdGF0ZWRbWzFdXVsyLF0NCmxlZnRfc2NyZXdoZWFkX3BvaW50XzIgPC0gYzRfbG1fc2NyZXdfc2NyZXdoZWFkJGxlZnRfc2NyZXdfcm90YXRlZFtbMV1dWzMsXQ0KDQptZWFuKG1hdDFbMV0sIG1hdDJbMV0pDQoNCmMobWVhbihsZWZ0X3NjcmV3aGVhZF9wb2ludF8xWzFdLCBsZWZ0X3NjcmV3aGVhZF9wb2ludF8yWzFdKSwgbWVhbihsZWZ0X3NjcmV3aGVhZF9wb2ludF8xWzJdLCBsZWZ0X3NjcmV3aGVhZF9wb2ludF8yWzJdKSkNCg0Kc2NyZXdoZWFkX2xpc3QNCg0KbGVmdF9yb2RfZGYgPC0gc2NyZXdfc2NyZXdoZWFkX2xvbmdfZGYgJT4lDQogICAgICAgICAgICAgICAgICBzZWxlY3QoaW1wbGFudCwgc2lkZSwgc2NyZXdfaGVhZHMpICU+JQ0KICAgICAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzaWRlLCB2YWx1ZXNfZnJvbSA9ICJzY3Jld19oZWFkcyIpDQoNCmxlZnRfcm9kX2RmJGxlZnRbWzFdXQ0KDQoNCmxlZnRfcm9kX2RmIDwtIGRvLmNhbGwocmJpbmQsIGxlZnRfcm9kX2RmJGxlZnQpDQoNCmxlZnRfcm9kX2RmICU+JQ0KICBhc190aWJibGUoKSAlPiUNCiAgYXJyYW5nZShWMikgJT4lDQogIGFzLm1hdHJpeCgpDQoNCnJiaW5kKGxlZnRfcm9kX2RmJGxlZnQpDQoNCnRyYW5zcG9zZShsZWZ0X3JvZF9kZiRsZWZ0KQ0KDQpzdF9idWZmZXIoc3RfbGluZXN0cmluZyhsZWZ0X3JvZF9kZiksIGRpc3QgPSAwLjAwMSkNCg0Kc3VtKHN0cl9jb3VudChzY3Jld19zY3Jld2hlYWRfbG9uZ19kZiRzaWRlLCBwYXR0ZXJuID0gImxlZnQiKSkNCiANCmBgYA0KIyMjIElMSUFDIA0KYGBge3J9DQpzY3Jld19mdW5jdGlvbiA8LSBmdW5jdGlvbihzY3Jld19zdGFydF94X29mZnNldCwgc2NyZXdfc3RhcnRfeSwgc2NyZXdfdHlwZSwgYW5nbGUsIHNjcmV3X2xlbmd0aF9tb2RpZmllciA9IDEsIHNjcmV3X3dpZHRoX21vZGlmaWVyID0gMSwgeV9zY2FsZSA9IDEpew0KICANCiAgcm90ID0gZnVuY3Rpb24oYSkgbWF0cml4KGMoY29zKGEpLCBzaW4oYSksIC1zaW4oYSksIGNvcyhhKSksIDIsIDIpDQogIA0KICBzY3Jld19sZW5ndGggPC0gMC4wMipzY3Jld19sZW5ndGhfbW9kaWZpZXINCiAgDQogIHNjcmV3X3dpZHRoIDwtIDAuMDEqc2NyZXdfd2lkdGhfbW9kaWZpZXINCiAgDQogICMjIyMgTEVGVCBTQ1JFVyAjIyMjDQogIA0KICBsZWZ0X3NjcmV3X3N0YXJ0IDwtIGMoMC41IC0gc2NyZXdfc3RhcnRfeF9vZmZzZXQsIHNjcmV3X3N0YXJ0X3kpDQogIA0KICByaWdodF9zY3Jld19zdGFydCA8LSBjKDAuNSArIHNjcmV3X3N0YXJ0X3hfb2Zmc2V0LCBzY3Jld19zdGFydF95KQ0KICANCiAgc2NyZXdfd2lkdGggPC0gY2FzZV93aGVuKA0KICAgIHNjcmV3X3R5cGUgPT0gInBlZGljbGUiIH4gc2NyZXdfd2lkdGgvMiwNCiAgICBzY3Jld190eXBlID09ICJsYXRlcmFsIG1hc3MiIH4gc2NyZXdfd2lkdGgvNCwNCiAgICBzY3Jld190eXBlID09ICJwYXJzIiB+IHNjcmV3X3dpZHRoLzQsDQogICAgc2NyZXdfdHlwZSA9PSAidHJhbnNsYW1pbmFyIiB+IHNjcmV3X3dpZHRoLzIsDQogICAgc2NyZXdfdHlwZSA9PSAiaWxpYWMiIHwgc2NyZXdfdHlwZSA9PSAiczJhaSIgfiBzY3Jld193aWR0aC8yIA0KICApDQogIA0KICBzY3Jld19sZW5ndGggPC0gY2FzZV93aGVuKA0KICAgIHNjcmV3X3R5cGUgPT0gInBlZGljbGUiIH4gc2NyZXdfbGVuZ3RoLA0KICAgIHNjcmV3X3R5cGUgPT0gImxhdGVyYWwgbWFzcyIgfiBzY3Jld19sZW5ndGgvMiwNCiAgICBzY3Jld190eXBlID09ICJwYXJzIiB+IHNjcmV3X2xlbmd0aC8yLA0KICAgIHNjcmV3X3R5cGUgPT0gInRyYW5zbGFtaW5hciIgfiBzY3Jld19sZW5ndGgsDQogICAgc2NyZXdfdHlwZSA9PSAiaWxpYWMiIHwgc2NyZXdfdHlwZSA9PSAiczJhaSIgfiBzY3Jld19sZW5ndGggDQogICkNCiAgDQogIGxlZnRfcG9pbnRfMSA8LSBzdF9wb2ludChjKGxlZnRfc2NyZXdfc3RhcnRbMV0sIGxlZnRfc2NyZXdfc3RhcnRbMl0pKQ0KICBsZWZ0X3BvaW50XzIgPC0gc3RfcG9pbnQoYyhsZWZ0X3BvaW50XzFbMV0gLSBzY3Jld19sZW5ndGgsIGxlZnRfcG9pbnRfMVsyXSArIHNjcmV3X3dpZHRoKSkNCiAgbGVmdF9wb2ludF8zIDwtIHN0X3BvaW50KGMobGVmdF9wb2ludF8xWzFdIC0gc2NyZXdfbGVuZ3RoLCBsZWZ0X3BvaW50XzFbMl0gLSBzY3Jld193aWR0aCkpDQogIA0KICBsZWZ0X3NjcmV3IDwtIHN0X3BvbHlnb24obGlzdChyYmluZChsZWZ0X3BvaW50XzEsIGxlZnRfcG9pbnRfMiwgbGVmdF9wb2ludF8zLCBsZWZ0X3BvaW50XzEpKSkNCiAgDQogIGxlZnRfc2NyZXdfcm90YXRlZCA8LSAobGVmdF9zY3JldyAtIGxlZnRfcG9pbnRfMSkqcm90KGFuZ2xlKi0xKnBpLzE4MCkgKyBsZWZ0X3BvaW50XzENCiAgDQogIGlmKHNjcmV3X3R5cGUgPT0gImlsaWFjIiB8IHNjcmV3X3R5cGUgPT0gInMyYWkiKXsNCiAgICBsZWZ0X3NjcmV3X3JvdGF0ZWQgPC0gbGVmdF9zY3Jld19yb3RhdGVkIC0gYyhzY3Jld19sZW5ndGgsICswLjAxKQ0KICB9DQogIA0KICBsZWZ0X3NjcmV3X3NmIDwtIHN0X2J1ZmZlcih4ID0gbGVmdF9zY3Jld19yb3RhdGVkLCBkaXN0ID0gMC4wMDEsIGVuZENhcFN0eWxlID0gIlNRVUFSRSIpDQogIA0KICBsZWZ0X3NjcmV3X3NmIDwtIHN0X2J1ZmZlcih4ID0gbGVmdF9zY3Jld19zZiwgZGlzdCA9IDAuMDAxLCBlbmRDYXBTdHlsZSA9ICJST1VORCIpDQogIA0KICANCiAgbGVmdF9zY3Jld2hlYWRfcG9pbnRfMSA8LSBsZWZ0X3NjcmV3X3JvdGF0ZWRbWzFdXVsyLF0NCiAgbGVmdF9zY3Jld2hlYWRfcG9pbnRfMiA8LSBsZWZ0X3NjcmV3X3JvdGF0ZWRbWzFdXVszLF0NCiAgDQogIGxlZnRfc2NyZXdfaGVhZCA8LSBjKG1lYW4obGVmdF9zY3Jld2hlYWRfcG9pbnRfMVsxXSwgbGVmdF9zY3Jld2hlYWRfcG9pbnRfMlsxXSksIG1lYW4obGVmdF9zY3Jld2hlYWRfcG9pbnRfMVsyXSwgbGVmdF9zY3Jld2hlYWRfcG9pbnRfMlsyXSkpDQogIA0KICANCiAgIyMjIyBSSUdIVCBTQ1JFVyAjIyMjDQogIA0KICByaWdodF9wb2ludF8xIDwtIHN0X3BvaW50KGMocmlnaHRfc2NyZXdfc3RhcnRbMV0sIHJpZ2h0X3NjcmV3X3N0YXJ0WzJdKSkNCiAgcmlnaHRfcG9pbnRfMiA8LSBzdF9wb2ludChjKHJpZ2h0X3BvaW50XzFbMV0gKyBzY3Jld19sZW5ndGgsIHJpZ2h0X3BvaW50XzFbMl0gLSBzY3Jld193aWR0aCkpDQogIHJpZ2h0X3BvaW50XzMgPC0gc3RfcG9pbnQoYyhyaWdodF9wb2ludF8xWzFdICsgc2NyZXdfbGVuZ3RoLCByaWdodF9wb2ludF8xWzJdICsgc2NyZXdfd2lkdGgpKQ0KICANCiAgDQogIHJpZ2h0X3NjcmV3IDwtIHN0X3BvbHlnb24obGlzdChyYmluZChyaWdodF9wb2ludF8xLCByaWdodF9wb2ludF8yLCByaWdodF9wb2ludF8zLCByaWdodF9wb2ludF8xKSkpDQogIA0KICANCiAgcmlnaHRfc2NyZXdfcm90YXRlZCA8LSAocmlnaHRfc2NyZXcgLSByaWdodF9wb2ludF8xKSpyb3QoYW5nbGUqcGkvMTgwKSArIHJpZ2h0X3BvaW50XzENCiAgDQogIGlmKHNjcmV3X3R5cGUgPT0gImlsaWFjIiB8IHNjcmV3X3R5cGUgPT0gInMyYWkiKXsNCiAgICByaWdodF9zY3Jld19yb3RhdGVkIDwtIHJpZ2h0X3NjcmV3X3JvdGF0ZWQgKyBjKHNjcmV3X2xlbmd0aCwgLTAuMDEpDQogIH0NCiAgDQogIHJpZ2h0X3NjcmV3X3NmIDwtIHN0X2J1ZmZlcih4ID0gcmlnaHRfc2NyZXdfcm90YXRlZCwgZGlzdCA9IDAuMDAxLCBlbmRDYXBTdHlsZSA9ICJTUVVBUkUiKQ0KICANCiAgcmlnaHRfc2NyZXdfc2YgPC0gc3RfYnVmZmVyKHggPSByaWdodF9zY3Jld19zZiwgZGlzdCA9IDAuMDAxLCBlbmRDYXBTdHlsZSA9ICJST1VORCIpDQogIA0KICByaWdodF9zY3Jld2hlYWRfcG9pbnRfMSA8LSByaWdodF9zY3Jld19yb3RhdGVkW1sxXV1bMixdDQogIHJpZ2h0X3NjcmV3aGVhZF9wb2ludF8yIDwtIHJpZ2h0X3NjcmV3X3JvdGF0ZWRbWzFdXVszLF0NCiAgDQogIHJpZ2h0X3NjcmV3X2hlYWQgPC0gYyhtZWFuKHJpZ2h0X3NjcmV3aGVhZF9wb2ludF8xWzFdLCByaWdodF9zY3Jld2hlYWRfcG9pbnRfMlsxXSksIG1lYW4ocmlnaHRfc2NyZXdoZWFkX3BvaW50XzFbMl0sIHJpZ2h0X3NjcmV3aGVhZF9wb2ludF8yWzJdKSkNCiAgDQogIA0KICANCiAgcmV0dXJuKGxpc3QobGVmdF9zY3Jld19zZiA9IGxlZnRfc2NyZXdfc2YsIA0KICAgICAgICAgICAgICBsZWZ0X3NjcmV3X2hlYWQgPSBsZWZ0X3NjcmV3X2hlYWQsDQogICAgICAgICAgICAgIHJpZ2h0X3NjcmV3X3NmID0gcmlnaHRfc2NyZXdfc2YsDQogICAgICAgICAgICAgIHJpZ2h0X3NjcmV3X2hlYWQgPSByaWdodF9zY3Jld19oZWFkKSkNCiAgDQp9DQoNCnNjcmV3X3NjcmV3aGVhZF9sb25nX2RmICU+JQ0KICBncm91cF9ieShzaWRlKSAlPiUNCiAgbXV0YXRlKHZlcnRlYnJhbF9udW1iZXIgPSByb3dfbnVtYmVyKCkpICU+JQ0KICB1bmdyb3VwKCkNCmBgYA0KDQpgYGB7cn0NCmlsaWFjX3NjcmV3X3NjcmV3aGVhZCA8LSBzY3Jld19mdW5jdGlvbihzY3Jld19zdGFydF94X29mZnNldCA9IGlsaWFjX3hfb2Zmc2V0LCBzY3Jld19zdGFydF95ID0gaWxpYWNfeSwgc2NyZXdfdHlwZSA9ICJpbGlhYyIsc2NyZXdfbGVuZ3RoX21vZGlmaWVyID0gMywgYW5nbGUgPSAtMTUwKQ0KDQpzMmFpX3NjcmV3X3NjcmV3aGVhZCA8LSBzY3Jld19mdW5jdGlvbihzY3Jld19zdGFydF94X29mZnNldCA9IHMyYWlfeF9vZmZzZXQsIHNjcmV3X3N0YXJ0X3kgPSBzMmFpX3ksIHNjcmV3X3R5cGUgPSAiczJhaSIsIHNjcmV3X2xlbmd0aF9tb2RpZmllciA9IDMsIGFuZ2xlID0gLTE1NSkNCg0KbGVmdCA8LSBzY3Jld19zY3Jld2hlYWRfbG9uZ19kZiAlPiUNCiAgICAgICAgICAgICAgICBzZWxlY3QoaW1wbGFudCwgc2lkZSwgc2NyZXdfaGVhZHMsIHZlcnRlYnJhbF9udW1iZXIpICU+JQ0KICAgICAgICAgICAgICAgIGFycmFuZ2UodmVydGVicmFsX251bWJlcikgJT4lDQogICAgICAgICAgICAgICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNpZGUsIHZhbHVlc19mcm9tID0gInNjcmV3X2hlYWRzIikgJT4lDQogIHNlbGVjdChpbXBsYW50LCBsZWZ0KQ0KDQoNCmxlZnQNCmxlZnRfcm9kX2RmIDwtIGRvLmNhbGwocmJpbmQsIGxlZnQkbGVmdCkNCg0KcmlnaHQgPC0gc2NyZXdfc2NyZXdoZWFkX2xvbmdfZGYgJT4lDQogICAgICAgICAgICAgICAgc2VsZWN0KGltcGxhbnQsIHNpZGUsIHNjcmV3X2hlYWRzLCB2ZXJ0ZWJyYWxfbnVtYmVyKSAlPiUNCiAgICAgICAgICAgICAgICBhcnJhbmdlKHZlcnRlYnJhbF9udW1iZXIpICU+JQ0KICAgICAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzaWRlLCB2YWx1ZXNfZnJvbSA9ICJzY3Jld19oZWFkcyIpICU+JQ0KICBzZWxlY3QoaW1wbGFudCwgcmlnaHQpDQoNCnJpZ2h0DQpyaWdodF9yb2RfZGYgPC0gZG8uY2FsbChyYmluZCwgcmlnaHQkcmlnaHQpDQoNCmxlZnRfcm9kX2RmDQoNCnJpZ2h0X3JvZF9kZg0KYGBgDQpgYGB7cn0NCnRyYW5zbGFtaW5hcl9zY3Jld19zY3Jld2hlYWRfbG9uZ19kZiAlPiUNCiAgc2VwYXJhdGUoY29sID0gaW1wbGFudCwgaW50byA9IGMoInNpZGUiLCAibGV2ZWwiKSwgc2VwID0gIl8iLCByZW1vdmUgPSBGQUxTRSkgJT4lDQogIGxlZnRfam9pbih2ZXJ0ZWJyYWxfbnVtYmVyX2RmKQ0KDQp0cmFuc2xhbWluYXJfc2NyZXdfc2NyZXdoZWFkX2xvbmdfZGYNCg0Kc2NyZXdfc2NyZXdoZWFkX2xvbmdfZGYgJT4lDQogIHVuaW9uX2FsbCh0cmFuc2xhbWluYXJfc2NyZXdfc2NyZXdoZWFkX2xvbmdfZGYpIA0KICBkaXN0aW5jdCgpDQogIA0KICB0aWJibGUoImxhYmVscyIgPSBsZXZlbHNfdmVjdG9yKSAlPiUNCiAgbXV0YXRlKHkgPSBsYWJlbF95X3ZlY3RvciwgDQogICAgICAgICBsZWZ0ID0gMC41IC0gbGFiZWxfeF9vZmZzZXQsDQogICAgICAgICByaWdodCA9IDAuNSArIGxhYmVsX3hfb2Zmc2V0KQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMobGVmdCwgcmlnaHQpLCBuYW1lc190byA9ICJzaWRlIiwgdmFsdWVzX3RvID0gIngiKSAlPiUNCiAgc2VsZWN0KGxhYmVscywgc2lkZSwgeCwgeSkNCg0KYGBgDQoNCg0KDQojIyMgUk9EUw0KDQpgYGB7cn0NCg0KYWxsX3NjcmV3cyA8LSBzdF9tdWx0aXBvbHlnb24oKHNjcmV3X3NjcmV3aGVhZF9sb25nX2RmJHNjcmV3cykpDQoNCg0KcmlnaHRfcm9kc19sb25nX2RmIDwtIGltcGxhbnRzX2xpc3QkaW1wbGFudHNfZGYgJT4lDQogIHJpZ2h0X2pvaW4oc2NyZXdfc2NyZXdoZWFkX2xvbmdfZGYpICU+JQ0KICBzZWxlY3QoaW1wbGFudCwgc2lkZSwgc2NyZXdfaGVhZHMpDQoNCg0KDQppZihzdHJfZGV0ZWN0KHN0cmluZyA9IHJpZ2h0X3JvZHNfbG9uZ19kZiRzaWRlLCBwYXR0ZXJuID0gInJpZ2h0Iikpew0KICByaWdodF9yb2RzX3dpZGVfZGYgPC0gcmlnaHRfcm9kc19sb25nX2RmICU+JQ0KICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzaWRlLCB2YWx1ZXNfZnJvbSA9ICJzY3Jld19oZWFkcyIpDQogIA0KICByaWdodF9yb2RfZGYgPC0gZG8uY2FsbChyYmluZCwgcmlnaHRfcm9kc193aWRlX2RmJHJpZ2h0KQ0KICANCiAgcmlnaHRfcm9kX3NmIDwtIHN0X2J1ZmZlcihzdF9saW5lc3RyaW5nKHJpZ2h0X3JvZF9kZiksIGRpc3QgPSAwLjAwMSkNCn1lbHNlew0KICByaWdodF9yb2Rfc2YgPC0gTlVMTA0KfQ0KDQoNCmwyX2hvb2sgPC0gaG9va19mdW5jdGlvbihob29rX3N0YXJ0X3hfb2Zmc2V0ID0gMC4wMiwgaG9va19zdGFydF95ID0gbDJfeSkNCg0KbDJfaG9va3MgPC0gbGlzdChsMl9ob29rJGxlZnRfdXBnb2luZ19ob29rLCBsMl9ob29rJGxlZnRfZG93bmdvaW5nX2hvb2tfc2YsIGwyX2hvb2skcmlnaHRfZG93bmdvaW5nX2hvb2tfc2YpDQoNCmwyX3VwZ29pbmdfaG9va3NfY29sbGVjdGlvbiA8LXN0X2dlb21ldHJ5Y29sbGVjdGlvbihsaXN0KGwyX2hvb2skbGVmdF91cGdvaW5nX2hvb2ssIGwyX2hvb2skcmlnaHRfZG93bmdvaW5nX2hvb2spKQ0KbDJfZG93bmdvaW5nX2hvb2tzX2NvbGxlY3Rpb24gPC1zdF9nZW9tZXRyeWNvbGxlY3Rpb24obGlzdChsMl9ob29rJGxlZnRfZG93bmdvaW5nX2hvb2ssIGwyX2hvb2skcmlnaHRfZG93bmdvaW5nX2hvb2spKQ0KDQpnZ2RyYXcoKSArDQogICAgICBkcmF3X2ltYWdlKHNwaW5lX3BuZywgc2NhbGUgPSAxLCB5ID0gMCwgdmFsaWduID0gMCwgeCA9IDAsIHdpZHRoID0gMSkgKw0KICAgICAgZHJhd190ZXh0KHRleHQgPSBsYWJlbHNfZGYkbGFiZWxzLCB4ID0gbGFiZWxzX2RmJHhfbGVmdCwgeSA9IGxhYmVsc19kZiR5LCBzaXplID0gMTIsIGZvbnRmYWNlID0gImJvbGQiKSArDQogICAgICBkcmF3X3RleHQodGV4dCA9IGxhYmVsc19kZiRsYWJlbHMsIHggPSBsYWJlbHNfZGYkeF9yaWdodCwgeSA9IGxhYmVsc19kZiR5LCBzaXplID0gMTIsIGZvbnRmYWNlID0gImJvbGQiKSArDQogICAgICBnZW9tX3BvaW50KGFlcyh4ID0gMC41IC0gaWxpYWNfeF9vZmZzZXQsIHkgPSBpbGlhY195KSwgc2l6ZSA9IDQpICsgDQogIGdlb21fcG9pbnQoYWVzKHggPSAwLjUgLSBzMmFpX3hfb2Zmc2V0LCB5ID0gczJhaV95KSwgc2l6ZSA9IDQpICsgDQogIGdlb21fc2YoZGF0YSA9IGwyX3VwZ29pbmdfaG9va3NfY29sbGVjdGlvbikgKw0KICBnZ3BhdHRlcm46Omdlb21fc2ZfcGF0dGVybihkYXRhID0gczJhaV9zY3Jld19zY3Jld2hlYWQkbGVmdF9zY3Jld19zZiwgcGF0dGVybiA9ICJzdHJpcGUiLCAgcGF0dGVybl9maWxsID0gInJlZCIsYWxwaGEgPSAwLjgsIHBhdHRlcm5fY29sb3VyID0gImJsdWUiLCBwYXR0ZXJuX2RlbnNpdHkgPSAwLjAxLCBwYXR0ZXJuX3NwYWNpbmcgPSAwLjAwMywgYW5nbGUgPSA3MCkgKw0KICBnZ3BhdHRlcm46Omdlb21fc2ZfcGF0dGVybihkYXRhID0gczJhaV9zY3Jld19zY3Jld2hlYWQkcmlnaHRfc2NyZXdfc2YsIHBhdHRlcm4gPSAic3RyaXBlIiwgIHBhdHRlcm5fZmlsbCA9ICJyZWQiLGFscGhhID0gMC44LCBwYXR0ZXJuX2NvbG91ciA9ICJibHVlIiwgcGF0dGVybl9kZW5zaXR5ID0gMC4wMSwgcGF0dGVybl9zcGFjaW5nID0gMC4wMDMsIGFuZ2xlID0gNzApICsNCiAgdGhlbWVfbWluaW1hbF9ncmlkKCkgICsNCiAgeWxpbSgwLCAwLjUpDQoNCmBgYA0KDQoNCg0KYGBge3J9DQoNCiMgbmFtZXMoaG9va19saXN0X2RmJGhvb2tzKSA8LSBob29rX2xpc3RfZGYkbGV2ZWxzDQoNCmhvb2tfbGlzdF9kZiA8LSBsYWJlbHNfZGYgJT4lDQogIHNlbGVjdChsYWJlbHMsIHkpICU+JQ0KICBtdXRhdGUobGV2ZWwgPSBzdHJfdG9fbG93ZXIobGFiZWxzKSkgJT4lDQogIGZpbHRlcihsZXZlbCAhPSAib2NjaXB1dCIsIGxldmVsICE9ICJpbGlhYyIsIGxldmVsICE9ICJzMmFpIikgJT4lDQogIG11dGF0ZShob29rcyA9IG1hcCgueCA9IHksIC5mID0gfiBob29rX2Z1bmN0aW9uKGhvb2tfc3RhcnRfeF9vZmZzZXQgPSAwLjAxLCBob29rX3N0YXJ0X3kgPSAuKSkpICU+JQ0KICBtdXRhdGUobGVmdF91cGdvaW5nX2xhbWluYXJfaG9vayA9IG1hcCgueCA9ICBob29rcywgLmYgPSB+IHBsdWNrKC54ID0gLiwgImxlZnRfdXBnb2luZ19sYW1pbmFyX2hvb2siKSkpICU+JQ0KICBtdXRhdGUobGVmdF91cGdvaW5nX3BlZGljbGVfaG9vayA9IG1hcCgueCA9ICBob29rcywgLmYgPSB+IHBsdWNrKC54ID0gLiwgImxlZnRfdXBnb2luZ19wZWRpY2xlX2hvb2siKSkpICU+JQ0KICBtdXRhdGUobGVmdF9kb3duZ29pbmdfbGFtaW5hcl9ob29rID0gbWFwKC54ID0gIGhvb2tzLCAuZiA9IH4gcGx1Y2soLnggPSAuLCAibGVmdF9kb3duZ29pbmdfbGFtaW5hcl9ob29rIikpKSAlPiUNCiAgbXV0YXRlKHJpZ2h0X3VwZ29pbmdfbGFtaW5hcl9ob29rID0gbWFwKC54ID0gIGhvb2tzLCAuZiA9IH4gcGx1Y2soLnggPSAuLCAicmlnaHRfdXBnb2luZ19sYW1pbmFyX2hvb2siKSkpICU+JQ0KICBtdXRhdGUocmlnaHRfdXBnb2luZ19wZWRpY2xlX2hvb2sgPSBtYXAoLnggPSAgaG9va3MsIC5mID0gfiBwbHVjaygueCA9IC4sICJyaWdodF91cGdvaW5nX3BlZGljbGVfaG9vayIpKSkgJT4lDQogIG11dGF0ZShyaWdodF9kb3duZ29pbmdfbGFtaW5hcl9ob29rID0gbWFwKC54ID0gIGhvb2tzLCAuZiA9IH4gcGx1Y2soLnggPSAuLCAicmlnaHRfZG93bmdvaW5nX2xhbWluYXJfaG9vayIpKSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYygtbGFiZWxzLCAteSwgLWxldmVsLCAtaG9va3MpLCBuYW1lc190byA9ICJpbXBsYW50X3R5cGUiLCB2YWx1ZXNfdG8gPSAiaG9vayIpJT4lDQogIHNlbGVjdChsZXZlbCwgaW1wbGFudF90eXBlLCBob29rKSAlPiUNCiAgc2VwYXJhdGUoY29sID0gaW1wbGFudF90eXBlLCBpbnRvID0gYygic2lkZSIsICJkaXJlY3Rpb25faG9vayIsICJob29rX3R5cGUiLCAiaW1wbGFudF90eXBlIikpICU+JQ0KICBtdXRhdGUoaW1wbGFudCA9IHBhc3RlKHNpZGUsIGxldmVsLCBkaXJlY3Rpb25faG9vaywgaG9va190eXBlLCBpbXBsYW50X3R5cGUsIHNlcCA9ICJfIikpICU+JQ0KICBzZWxlY3QobGV2ZWwsIGltcGxhbnQsIGhvb2spICU+JQ0KICBsZWZ0X2pvaW4odmVydGVicmFsX251bWJlcl9kZikNCiAgDQoNCiMgYyhsZWZ0X3VwZ29pbmdfaG9vaywgbGVmdF9kb3duZ29pbmdfaG9vaywgcmlnaHRfdXBnb2luZ19ob29rLCByaWdodF9kb3duZ29pbmdfaG9vaykNCg0KdXBnb2luZ19sYW1pbmFyX2hvb2tzIDwtIGhvb2tfbGlzdF9kZiAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW1wbGFudCwgcGF0dGVybiA9ICJ1cGdvaW5nX2xhbWluYXIiKSkNCg0KdXBnb2luZ19wZWRpY2xlX2hvb2tzIDwtIGhvb2tfbGlzdF9kZiAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW1wbGFudCwgcGF0dGVybiA9ICJ1cGdvaW5nX3BlZGljbGUiKSkNCg0KZG93bmdvaW5nX2xhbWluYXJfaG9va3MgPC0gaG9va19saXN0X2RmICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbXBsYW50LCBwYXR0ZXJuID0gImRvd25nb2luZ19sYW1pbmFyIikpDQoNCg0KDQp1cGdvaW5nX2hvb2tzX2NvbGxlY3Rpb24gPC1zdF9nZW9tZXRyeWNvbGxlY3Rpb24odXBnb2luZ19sYW1pbmFyX2hvb2tzJGhvb2spDQoNCnBlZGljbGVfaG9va3NfY29sbGVjdGlvbiA8LXN0X2dlb21ldHJ5Y29sbGVjdGlvbih1cGdvaW5nX3BlZGljbGVfaG9va3MkaG9vaykNCg0KZG93bmdvaW5nX2hvb2tzX2NvbGxlY3Rpb24gPC1zdF9nZW9tZXRyeWNvbGxlY3Rpb24oZG93bmdvaW5nX2xhbWluYXJfaG9va3MkaG9vaykNCg0KZ2dkcmF3KCkgKw0KICAgICAgZHJhd19pbWFnZShzcGluZV9wbmcsIHNjYWxlID0gMSwgeSA9IDAsIHZhbGlnbiA9IDAsIHggPSAwLCB3aWR0aCA9IDEpICsNCiAgICAgIGRyYXdfdGV4dCh0ZXh0ID0gbGFiZWxzX2RmJGxhYmVscywgeCA9IGxhYmVsc19kZiR4X2xlZnQsIHkgPSBsYWJlbHNfZGYkeSwgc2l6ZSA9IDEyLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICAgICAgZHJhd190ZXh0KHRleHQgPSBsYWJlbHNfZGYkbGFiZWxzLCB4ID0gbGFiZWxzX2RmJHhfcmlnaHQsIHkgPSBsYWJlbHNfZGYkeSwgc2l6ZSA9IDEyLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICAgICAgZ2VvbV9wb2ludChhZXMoeCA9IDAuNSAtIGlsaWFjX3hfb2Zmc2V0LCB5ID0gaWxpYWNfeSksIHNpemUgPSA0KSArIA0KICBnZW9tX3BvaW50KGFlcyh4ID0gMC41IC0gczJhaV94X29mZnNldCwgeSA9IHMyYWlfeSksIHNpemUgPSA0KSArIA0KICBnZW9tX3NmKGRhdGEgPSBwZWRpY2xlX2hvb2tzX2NvbGxlY3Rpb24pICsNCiAgZ2dwYXR0ZXJuOjpnZW9tX3NmX3BhdHRlcm4oZGF0YSA9IHMyYWlfc2NyZXdfc2NyZXdoZWFkJGxlZnRfc2NyZXdfc2YsIHBhdHRlcm4gPSAic3RyaXBlIiwgIHBhdHRlcm5fZmlsbCA9ICJyZWQiLGFscGhhID0gMC44LCBwYXR0ZXJuX2NvbG91ciA9ICJibHVlIiwgcGF0dGVybl9kZW5zaXR5ID0gMC4wMSwgcGF0dGVybl9zcGFjaW5nID0gMC4wMDMsIGFuZ2xlID0gNzApICsNCiAgZ2dwYXR0ZXJuOjpnZW9tX3NmX3BhdHRlcm4oZGF0YSA9IHMyYWlfc2NyZXdfc2NyZXdoZWFkJHJpZ2h0X3NjcmV3X3NmLCBwYXR0ZXJuID0gInN0cmlwZSIsICBwYXR0ZXJuX2ZpbGwgPSAicmVkIixhbHBoYSA9IDAuOCwgcGF0dGVybl9jb2xvdXIgPSAiYmx1ZSIsIHBhdHRlcm5fZGVuc2l0eSA9IDAuMDEsIHBhdHRlcm5fc3BhY2luZyA9IDAuMDAzLCBhbmdsZSA9IDcwKSArDQogIHRoZW1lX21pbmltYWxfZ3JpZCgpIA0KDQoNCmBgYA0KDQoNCiMjIyBHRVQgUEVESUNMRSBZIHZhbHVlcw0KYGBge3J9DQoNCnh5X2xpbmVzIDwtIHRpYmJsZSh4X2xlZnQgPSAwLjQ1LCB4X3JpZ2h0ID0gMC41NSwgeSA9IHNlcShmcm9tID0gMCwgdG8gPSAxLCBieSA9IDAuMDEpKQ0KDQp4eV9saW5lcw0KDQpnZ2RyYXcoKSArDQogICAgICBkcmF3X2ltYWdlKHNwaW5lX3BuZywgc2NhbGUgPSAxLCB5ID0gMCwgdmFsaWduID0gMCwgeCA9IDAsIHdpZHRoID0gMSkgKw0KICAgICAgZHJhd190ZXh0KHRleHQgPSBsYWJlbHNfZGYkbGFiZWxzLCB4ID0gbGFiZWxzX2RmJHhfbGVmdCwgeSA9IGxhYmVsc19kZiR5LCBzaXplID0gMTIsIGZvbnRmYWNlID0gImJvbGQiKSArDQogICAgICBkcmF3X3RleHQodGV4dCA9IGxhYmVsc19kZiRsYWJlbHMsIHggPSBsYWJlbHNfZGYkeF9yaWdodCwgeSA9IGxhYmVsc19kZiR5LCBzaXplID0gMTIsIGZvbnRmYWNlID0gImJvbGQiKSArDQogICAgICBnZW9tX3BvaW50KGFlcyh4ID0gMC41IC0gaWxpYWNfeF9vZmZzZXQsIHkgPSBpbGlhY195KSwgc2l6ZSA9IDQpICsgDQogIGdlb21fbGluZXJhbmdlKGRhdGEgPSB4eV9saW5lcywgYWVzKHhtaW4gPSB4X2xlZnQsIHhtYXggPSB4X3JpZ2h0LCB5ID0geSwgY29sb3IgPSB5KSkgKw0KICBkcmF3X3RleHQodGV4dCA9IHh5X2xpbmVzJHksIHggPSB4eV9saW5lcyR4X2xlZnQgLSAwLjA1LCB5ID0geHlfbGluZXMkeSwgc2l6ZSA9IDcpICsNCiAgIyBnZW9tX3RleHQoZGF0YSA9IHh5X2xpbmVzLCAgYWVzKCkpDQogIGdlb21fc2YoZGF0YSA9IHBlZGljbGVfaG9va3NfY29sbGVjdGlvbikgKw0KICBnZ3BhdHRlcm46Omdlb21fc2ZfcGF0dGVybihkYXRhID0gczJhaV9zY3Jld19zY3Jld2hlYWQkbGVmdF9zY3Jld19zZiwgcGF0dGVybiA9ICJzdHJpcGUiLCAgcGF0dGVybl9maWxsID0gInJlZCIsYWxwaGEgPSAwLjgsIHBhdHRlcm5fY29sb3VyID0gImJsdWUiLCBwYXR0ZXJuX2RlbnNpdHkgPSAwLjAxLCBwYXR0ZXJuX3NwYWNpbmcgPSAwLjAwMywgYW5nbGUgPSA3MCkgKw0KICBnZ3BhdHRlcm46Omdlb21fc2ZfcGF0dGVybihkYXRhID0gczJhaV9zY3Jld19zY3Jld2hlYWQkcmlnaHRfc2NyZXdfc2YsIHBhdHRlcm4gPSAic3RyaXBlIiwgIHBhdHRlcm5fZmlsbCA9ICJyZWQiLGFscGhhID0gMC44LCBwYXR0ZXJuX2NvbG91ciA9ICJibHVlIiwgcGF0dGVybl9kZW5zaXR5ID0gMC4wMSwgcGF0dGVybl9zcGFjaW5nID0gMC4wMDMsIGFuZ2xlID0gNzApICsNCiAgdGhlbWVfbWluaW1hbF9ncmlkKCkgKw0KICB5bGltKDAsIDAuNSkNCiAgDQogIA0KYGBgDQoNCmBgYHtyfQ0Kb2NjaXB1dF9wZWRpY2xlX3kgPC0gLjkxNw0KYzFfcGVkaWNsZV95IDwtIC44OQ0KYzJfcGVkaWNsZV95IDwtIC44NjUNCmMzX3BlZGljbGVfeSA8LSAuODQ4DQpjNF9wZWRpY2xlX3kgPC0gLjgzMQ0KYzVfcGVkaWNsZV95IDwtIC44MTQNCmM2X3BlZGljbGVfeSA8LSAuNzk3DQpjN19wZWRpY2xlX3kgPC0gLjc4DQp0MV9wZWRpY2xlX3kgPC0gLjc1NQ0KdDJfcGVkaWNsZV95IDwtIC43Mw0KdDNfcGVkaWNsZV95IDwtIC43MDUNCnQ0X3BlZGljbGVfeSA8LSAuNjgNCnQ1X3BlZGljbGVfeSA8LSAuNjUNCnQ2X3BlZGljbGVfeSA8LSAuNjINCnQ3X3BlZGljbGVfeSA8LSAuNTkNCnQ4X3BlZGljbGVfeSA8LSAuNTYNCnQ5X3BlZGljbGVfeSA8LSAuNTI1DQp0MTBfcGVkaWNsZV95IDwtIC40OQ0KdDExX3BlZGljbGVfeSA8LSAuNDU1DQp0MTJfcGVkaWNsZV95IDwtIC40Mg0KbDFfcGVkaWNsZV95IDwtIC4zOA0KbDJfcGVkaWNsZV95IDwtIC4zNQ0KbDNfcGVkaWNsZV95IDwtIC4zMQ0KbDRfcGVkaWNsZV95IDwtIC4yNw0KbDVfcGVkaWNsZV95IDwtIC4yMzUNCnMxX3BlZGljbGVfeSA8LSAuMjANCmlsaWFjX3BlZGljbGVfeSA8LSAuMTgNCnMyYWlfcGVkaWNsZV95IDwtIC4xNQ0KDQp4IDwtIHNlcShmcm9tID0gMC40LCB0byA9IDAuNiwgYnkgPSAwLjAwMSkNCg0KeSA8LSBzZXEoZnJvbSA9IDAuMSwgdG8gPSAwLjksIGJ5ID0gMC4wMDEpDQoNCnh5X2dyaWQgPC0gZXhwYW5kLmdyaWQoeCwgeSkgJT4lDQogIGFzX3RpYmJsZSgpICU+JQ0KICByZW5hbWUoeCA9IFZhcjEsIHkgPSBWYXIyKSAlPiUNCiAgbXV0YXRlKHNpZGUgPSBpZl9lbHNlKHggPCAwLjUsICJsZWZ0IiwgInJpZ2h0IikpDQoNCnh5X2dyaWQNCg0KYGBgDQoNCiMjIHJlYWQgaW4gY29vcmRpbmF0ZXMgY3N2J3MNCmBgYHtyfQ0KaW5mZXJpb3JfbGFtaW5hX3Jhd19jb29yZGluYXRlc19kZiA8LSByZWFkX2NzdigiY29vcmRpbmF0ZXNfaW5mZXJpb3JfbGFtaW5hLmNzdiIpDQoNCnN1cGVyaW9yX2xhbWluYV9yYXdfY29vcmRpbmF0ZXNfZGYgPC0gcmVhZF9jc3YoImNvb3JkaW5hdGVzX3N1cGVyaW9yX2xhbWluYS5jc3YiKQ0KDQpzdGFydF9wb2ludF9jb29yZGluYXRlc19kZl9sZWZ0IDwtIHN1cGVyaW9yX2xhbWluYV9yYXdfY29vcmRpbmF0ZXNfZGYgJT4lDQogIHVuaW9uX2FsbChpbmZlcmlvcl9sYW1pbmFfcmF3X2Nvb3JkaW5hdGVzX2RmKQ0KDQpzdGFydF9wb2ludF9jb29yZGluYXRlc19kZiA8LSBzdGFydF9wb2ludF9jb29yZGluYXRlc19kZl9sZWZ0ICU+JQ0KICBtdXRhdGUoeF9yaWdodCA9IDAuNSArICgwLjUteCkpICU+JQ0KICBtdXRhdGUoeCA9IHhfcmlnaHQpICU+JQ0KICBzZWxlY3QoLXhfcmlnaHQpICU+JQ0KICBtdXRhdGUoc2lkZSA9ICJyaWdodCIpICU+JQ0KICB1bmlvbl9hbGwoc3RhcnRfcG9pbnRfY29vcmRpbmF0ZXNfZGZfbGVmdCkNCg0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KaG9va19saXN0X2RmIDwtIHN0YXJ0X3BvaW50X2Nvb3JkaW5hdGVzX2RmICU+JQ0KICBtdXRhdGUobGFtaW5hcl9ob29rc19saXN0ID0gY2FzZV93aGVuKA0KICAgIGNvb3JkaW5hdGVfdHlwZSA9PSAic3VwZXJpb3JfbGFtaW5hIiB+IG1hcCgueCA9IHksIC5mID0gfiBob29rX2Rvd25nb2luZ19mdW5jdGlvbihob29rX3N0YXJ0X3hfb2Zmc2V0ID0gMC4wMDUsIGhvb2tfZWRnZV95ID0gLikpLA0KICAgIGNvb3JkaW5hdGVfdHlwZSA9PSAiaW5mZXJpb3JfbGFtaW5hIiB+IG1hcCgueCA9IHksIC5mID0gfiBob29rX2Z1bmN0aW9uXzIoaG9va19zdGFydF94X29mZnNldCA9IDAuMDA1LCBob29rX2VkZ2VfeSA9IC4pKQ0KICAgICkpICU+JQ0KICAgbXV0YXRlKGhvb2tfaW1wbGFudCA9IGNhc2Vfd2hlbigNCiAgICBjb29yZGluYXRlX3R5cGUgPT0gInN1cGVyaW9yX2xhbWluYSIgJiBzaWRlID09ICJsZWZ0IiB+IG1hcCgueCA9ICBsYW1pbmFyX2hvb2tzX2xpc3QsIC5mID0gfiBwbHVjaygueCA9IC4sICJsZWZ0X2Rvd25nb2luZ19sYW1pbmFyX2hvb2siKSksDQogICAgY29vcmRpbmF0ZV90eXBlID09ICJpbmZlcmlvcl9sYW1pbmEiICYgc2lkZSA9PSAibGVmdCIgfiBtYXAoLnggPSBsYW1pbmFyX2hvb2tzX2xpc3QsIC5mID0gfiBwbHVjaygueCA9IC4sICJsZWZ0X3VwZ29pbmdfbGFtaW5hcl9ob29rIikpLA0KICAgIGNvb3JkaW5hdGVfdHlwZSA9PSAic3VwZXJpb3JfbGFtaW5hIiAmIHNpZGUgPT0gInJpZ2h0IiB+IG1hcCgueCA9ICBsYW1pbmFyX2hvb2tzX2xpc3QsIC5mID0gfiBwbHVjaygueCA9IC4sICJyaWdodF9kb3duZ29pbmdfbGFtaW5hcl9ob29rIikpLA0KICAgIGNvb3JkaW5hdGVfdHlwZSA9PSAiaW5mZXJpb3JfbGFtaW5hIiAmIHNpZGUgPT0gInJpZ2h0IiB+IG1hcCgueCA9IGxhbWluYXJfaG9va3NfbGlzdCwgLmYgPSB+IHBsdWNrKC54ID0gLiwgInJpZ2h0X3VwZ29pbmdfbGFtaW5hcl9ob29rIikpDQogICApKSAlPiUNCiAgbXV0YXRlKGhvb2tfaW1wbGFudF90eXBlID0gY2FzZV93aGVuKA0KICAgIGNvb3JkaW5hdGVfdHlwZSA9PSAic3VwZXJpb3JfbGFtaW5hIiAmIHNpZGUgPT0gImxlZnQiIH4gcGFzdGUoc2lkZSwgbGV2ZWwsICJkb3duZ29pbmdfbGFtaW5hcl9ob29rIiwgc2VwID0gIl8iKSwgDQogICAgY29vcmRpbmF0ZV90eXBlID09ICJpbmZlcmlvcl9sYW1pbmEiICYgc2lkZSA9PSAibGVmdCIgfiBwYXN0ZShzaWRlLCBsZXZlbCwgInVwZ29pbmdfbGFtaW5hcl9ob29rIiwgc2VwID0gIl8iKSwgDQogICAgY29vcmRpbmF0ZV90eXBlID09ICJzdXBlcmlvcl9sYW1pbmEiICYgc2lkZSA9PSAicmlnaHQiIH4gcGFzdGUoc2lkZSwgbGV2ZWwsICJkb3duZ29pbmdfbGFtaW5hcl9ob29rIiwgc2VwID0gIl8iKSwgDQogICAgY29vcmRpbmF0ZV90eXBlID09ICJpbmZlcmlvcl9sYW1pbmEiICYgc2lkZSA9PSAicmlnaHQiIH4gcGFzdGUoc2lkZSwgbGV2ZWwsICJ1cGdvaW5nX2xhbWluYXJfaG9vayIsIHNlcCA9ICJfIikNCiAgICkpIA0KDQoNCmhvb2tfc3RhcnRzX2RmIDwtIHN0YXJ0X3BvaW50X2Nvb3JkaW5hdGVzX2RmICU+JQ0KICBtdXRhdGUoeF9vZmZzZXQgPSAwLjAzKSAlPiUNCiAgc2VsZWN0KGxldmVsLHhfb2Zmc2V0LCB5KSU+JQ0KICBkaXN0aW5jdCgpDQoNCmhvb2tfc3RhcnRzX2RmDQoNCnN1cGVyaW9yX2xhbWluYV9yYXdfY29vcmRpbmF0ZXNfZGYgJT4lDQogIHNlbGVjdChsZXZlbCwgeSkgJT4lDQogIGRpc3RpbmN0KCkgJT4lDQogICAgbXV0YXRlKHhfb2Zmc2V0ID0gMC4wMykgJT4lDQogIHNlbGVjdChsZXZlbCx4X29mZnNldCwgeSkgDQoNCnRwX2hvb2tzX2xpc3RfZGYgPC0gc3VwZXJpb3JfbGFtaW5hX3Jhd19jb29yZGluYXRlc19kZiAlPiUNCiAgc2VsZWN0KGxldmVsLCB5KSAlPiUNCiAgZGlzdGluY3QoKSAlPiUNCiAgICBtdXRhdGUoeF9vZmZzZXQgPSBjYXNlX3doZW4oDQogICAgICBzdHJfc3RhcnRzKGxldmVsLCBwYXR0ZXJuID0gInQiKSB+IDAuMDMsDQogICAgICBsZXZlbCA9PSAibDUiIH4gMC4wNCwgDQogICAgICBsZXZlbCA9PSAibDQiIH4gMC4wMzgsIA0KICAgICAgbGV2ZWwgPT0gImwzIiB+IDAuMDM2LA0KICAgICAgbGV2ZWwgPT0gImwyIiB+IDAuMDM0LA0KICAgICAgbGV2ZWwgPT0gImwxIiB+IDAuMDMyDQogICAgKSkgJT4lDQogIHNlbGVjdChsZXZlbCx4X29mZnNldCwgeSkgICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3Qoc3RyaW5nID0gbGV2ZWwsIHBhdHRlcm4gPSAibCIpIHwgc3RyX2RldGVjdChzdHJpbmcgPSBsZXZlbCwgcGF0dGVybiA9ICJ0IikpICU+JQ0KICBtdXRhdGUodHBfaG9va3NfbGlzdCA9IG1hcDIoLnggPSB4X29mZnNldCwgLnkgPSB5LCAuZiA9IH4gaG9va190cF9mdW5jdGlvbihob29rX3N0YXJ0X3hfb2Zmc2V0ID0gLngsIGhvb2tfZWRnZV95ID0gLnkpKSkgJT4lDQogIG11dGF0ZShsZWZ0ID0gbWFwKC54ID0gIHRwX2hvb2tzX2xpc3QsIC5mID0gfiBwbHVjaygueCA9IC4sICJsZWZ0X3RwX2hvb2siKSkpICU+JQ0KICBtdXRhdGUocmlnaHQgPSBtYXAoLnggPSAgdHBfaG9va3NfbGlzdCwgLmYgPSB+IHBsdWNrKC54ID0gLiwgInJpZ2h0X3RwX2hvb2siKSkpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMobGVmdCwgcmlnaHQpLCBuYW1lc190byA9ICJzaWRlIiwgdmFsdWVzX3RvID0gImltcGxhbnQiKSAlPiUNCiAgbXV0YXRlKGltcGxhbnRfdHlwZSA9IHBhc3RlKHNpZGUsIGxldmVsLCAidHBfaG9vayIsIHNlcCA9ICJfIikpICU+JQ0KICBzZWxlY3QobGV2ZWwsIHNpZGUsIGltcGxhbnRfdHlwZSwgaW1wbGFudCkNCg0KDQp0cF9ob29rX2hlYWRzX2xpc3RfZGYgPC0gc3VwZXJpb3JfbGFtaW5hX3Jhd19jb29yZGluYXRlc19kZiAlPiUNCiAgc2VsZWN0KGxldmVsLCB5KSAlPiUNCiAgZGlzdGluY3QoKSAlPiUNCiAgICBtdXRhdGUoeF9vZmZzZXQgPSBjYXNlX3doZW4oDQogICAgICBzdHJfc3RhcnRzKGxldmVsLCBwYXR0ZXJuID0gInQiKSB+IDAuMDMsDQogICAgICBsZXZlbCA9PSAibDUiIH4gMC4wNCwgDQogICAgICBsZXZlbCA9PSAibDQiIH4gMC4wMzgsIA0KICAgICAgbGV2ZWwgPT0gImwzIiB+IDAuMDM2LA0KICAgICAgbGV2ZWwgPT0gImwyIiB+IDAuMDM0LA0KICAgICAgbGV2ZWwgPT0gImwxIiB+IDAuMDMyDQogICAgKSkgJT4lDQogIHNlbGVjdChsZXZlbCx4X29mZnNldCwgeSkgICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3Qoc3RyaW5nID0gbGV2ZWwsIHBhdHRlcm4gPSAibCIpIHwgc3RyX2RldGVjdChzdHJpbmcgPSBsZXZlbCwgcGF0dGVybiA9ICJ0IikpICU+JQ0KICBtdXRhdGUodHBfaG9va3NfbGlzdCA9IG1hcDIoLnggPSB4X29mZnNldCwgLnkgPSB5LCAuZiA9IH4gaG9va190cF9mdW5jdGlvbihob29rX3N0YXJ0X3hfb2Zmc2V0ID0gLngsIGhvb2tfZWRnZV95ID0gLnkpKSkgJT4lDQogIG11dGF0ZShsZWZ0ID0gbWFwKC54ID0gIHRwX2hvb2tzX2xpc3QsIC5mID0gfiBwbHVjaygueCA9IC4sICJsZWZ0X3RwX2hvb2tfaGVhZCIpKSkgJT4lDQogIG11dGF0ZShyaWdodCA9IG1hcCgueCA9ICB0cF9ob29rc19saXN0LCAuZiA9IH4gcGx1Y2soLnggPSAuLCAicmlnaHRfdHBfaG9va19oZWFkIikpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGxlZnQsIHJpZ2h0KSwgbmFtZXNfdG8gPSAic2lkZSIsIHZhbHVlc190byA9ICJob29rX2hlYWQiKSAlPiUNCiAgbXV0YXRlKGltcGxhbnRfdHlwZSA9IHBhc3RlKHNpZGUsIGxldmVsLCAidHBfaG9vayIsIHNlcCA9ICJfIikpICU+JQ0KICBzZWxlY3QobGV2ZWwsIHNpZGUsIGltcGxhbnRfdHlwZSwgaG9va19oZWFkKQ0KDQp0cF9ob29rc19kZiA8LSB0cF9ob29rc19saXN0X2RmICU+JQ0KICBsZWZ0X2pvaW4odHBfaG9va19oZWFkc19saXN0X2RmKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQp1cGdvaW5nX2xhbWluYXJfaG9va3MgPC0gaG9va19saXN0X2RmICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChob29rX2ltcGxhbnRfdHlwZSwgcGF0dGVybiA9ICJ1cGdvaW5nX2xhbWluYXIiKSkNCg0KZG93bmdvaW5nX2xhbWluYXJfaG9va3MgPC0gaG9va19saXN0X2RmICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChob29rX2ltcGxhbnRfdHlwZSwgcGF0dGVybiA9ICJkb3duZ29pbmdfbGFtaW5hciIpKQ0KDQp1cGdvaW5nX2hvb2tzX2NvbGxlY3Rpb24gPC1zdF9nZW9tZXRyeWNvbGxlY3Rpb24odXBnb2luZ19sYW1pbmFyX2hvb2tzJGhvb2tfaW1wbGFudCkNCg0KZG93bmdvaW5nX2hvb2tzX2NvbGxlY3Rpb24gPC1zdF9nZW9tZXRyeWNvbGxlY3Rpb24oZG93bmdvaW5nX2xhbWluYXJfaG9va3MkaG9va19pbXBsYW50KQ0KDQp0cF9ob29rc19jb2xsZWN0aW9uIDwtc3RfZ2VvbWV0cnljb2xsZWN0aW9uKHRwX2hvb2tzX2xpc3RfZGYkaW1wbGFudCkNCg0KZ2dkcmF3KCkgKw0KICAgICAgZHJhd19pbWFnZShzcGluZV9wbmcsIHNjYWxlID0gMSwgeSA9IDAsIHZhbGlnbiA9IDAsIHggPSAwLCB3aWR0aCA9IDEpICsNCiAgICAgIGRyYXdfdGV4dCh0ZXh0ID0gbGFiZWxzX2RmJGxhYmVscywgeCA9IGxhYmVsc19kZiR4X2xlZnQsIHkgPSBsYWJlbHNfZGYkeSwgc2l6ZSA9IDEyLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICAgICAgZHJhd190ZXh0KHRleHQgPSBsYWJlbHNfZGYkbGFiZWxzLCB4ID0gbGFiZWxzX2RmJHhfcmlnaHQsIHkgPSBsYWJlbHNfZGYkeSwgc2l6ZSA9IDEyLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICAgICAgZ2VvbV9wb2ludChhZXMoeCA9IDAuNSAtIGlsaWFjX3hfb2Zmc2V0LCB5ID0gaWxpYWNfeSksIHNpemUgPSA0KSArIA0KICBnZW9tX3BvaW50KGFlcyh4ID0gMC41IC0gczJhaV94X29mZnNldCwgeSA9IHMyYWlfeSksIHNpemUgPSA0KSArIA0KICAjIGdlb21fc2YoZGF0YSA9IHVwZ29pbmdfaG9va3NfY29sbGVjdGlvbiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gdHBfaG9va3NfY29sbGVjdGlvbiwgYWxwaGEgPSAwLjUpICsNCiAgZ2dwYXR0ZXJuOjpnZW9tX3NmX3BhdHRlcm4oZGF0YSA9IHMyYWlfc2NyZXdfc2NyZXdoZWFkJGxlZnRfc2NyZXdfc2YsIHBhdHRlcm4gPSAic3RyaXBlIiwgIHBhdHRlcm5fZmlsbCA9ICJyZWQiLGFscGhhID0gMC44LCBwYXR0ZXJuX2NvbG91ciA9ICJibHVlIiwgcGF0dGVybl9kZW5zaXR5ID0gMC4wMSwgcGF0dGVybl9zcGFjaW5nID0gMC4wMDMsIGFuZ2xlID0gNzApICsNCiAgZ2dwYXR0ZXJuOjpnZW9tX3NmX3BhdHRlcm4oZGF0YSA9IHMyYWlfc2NyZXdfc2NyZXdoZWFkJHJpZ2h0X3NjcmV3X3NmLCBwYXR0ZXJuID0gInN0cmlwZSIsICBwYXR0ZXJuX2ZpbGwgPSAicmVkIixhbHBoYSA9IDAuOCwgcGF0dGVybl9jb2xvdXIgPSAiYmx1ZSIsIHBhdHRlcm5fZGVuc2l0eSA9IDAuMDEsIHBhdHRlcm5fc3BhY2luZyA9IDAuMDAzLCBhbmdsZSA9IDcwKSArDQogIHRoZW1lX21pbmltYWxfZ3JpZCgpIA0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQppbmZlcmlvcl9sYW1pbmFfcmF3X2Nvb3JkaW5hdGVzX2RmIDwtIHJlYWRfY3N2KCJjb29yZGluYXRlc19pbmZlcmlvcl9sYW1pbmEuY3N2IikNCg0KDQojIHVwZ29pbmdfaG9va3Nfc3RhcnRzX2RmIDwtIGluZmVyaW9yX2xhbWluYV9yYXdfY29vcmRpbmF0ZXNfZGYgJT4lDQojICAgbXV0YXRlKHhfb2Zmc2V0ID0gMC4wMikgJT4lDQojICAgc2VsZWN0KGxldmVsLCB4X29mZnNldCwgeSkgDQoNCmhvb2tfbGlzdF9kZiA8LSB1cGdvaW5nX2hvb2tzX3N0YXJ0c19kZiAlPiUNCiAgbXV0YXRlKGhvb2tzID0gbWFwKC54ID0geSwgLmYgPSB+IGhvb2tfZnVuY3Rpb25fMihob29rX3N0YXJ0X3hfb2Zmc2V0ID0gMC4wMDUsIGhvb2tfZWRnZV95ID0gLikpKSAlPiUNCiAgbXV0YXRlKGxlZnRfdXBnb2luZ19sYW1pbmFyX2hvb2sgPSBtYXAoLnggPSAgaG9va3MsIC5mID0gfiBwbHVjaygueCA9IC4sICJsZWZ0X3VwZ29pbmdfbGFtaW5hcl9ob29rIikpKSAlPiUNCiAgIyBtdXRhdGUobGVmdF91cGdvaW5nX3BlZGljbGVfaG9vayA9IG1hcCgueCA9ICBob29rcywgLmYgPSB+IHBsdWNrKC54ID0gLiwgImxlZnRfdXBnb2luZ19wZWRpY2xlX2hvb2siKSkpICU+JQ0KICAjIG11dGF0ZShsZWZ0X2Rvd25nb2luZ19sYW1pbmFyX2hvb2sgPSBtYXAoLnggPSAgaG9va3MsIC5mID0gfiBwbHVjaygueCA9IC4sICJsZWZ0X2Rvd25nb2luZ19sYW1pbmFyX2hvb2siKSkpICU+JQ0KICBtdXRhdGUocmlnaHRfdXBnb2luZ19sYW1pbmFyX2hvb2sgPSBtYXAoLnggPSAgaG9va3MsIC5mID0gfiBwbHVjaygueCA9IC4sICJyaWdodF91cGdvaW5nX2xhbWluYXJfaG9vayIpKSkgJT4lIA0KICAjIG11dGF0ZShyaWdodF91cGdvaW5nX3BlZGljbGVfaG9vayA9IG1hcCgueCA9ICBob29rcywgLmYgPSB+IHBsdWNrKC54ID0gLiwgInJpZ2h0X3VwZ29pbmdfcGVkaWNsZV9ob29rIikpKSAlPiUNCiAgIyBtdXRhdGUocmlnaHRfZG93bmdvaW5nX2xhbWluYXJfaG9vayA9IG1hcCgueCA9ICBob29rcywgLmYgPSB+IHBsdWNrKC54ID0gLiwgInJpZ2h0X2Rvd25nb2luZ19sYW1pbmFyX2hvb2siKSkpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoLXhfb2Zmc2V0LCAteSwgLWxldmVsLCAtaG9va3MpLCBuYW1lc190byA9ICJpbXBsYW50X3R5cGUiLCB2YWx1ZXNfdG8gPSAiaG9vayIpJT4lDQogIHNlbGVjdChsZXZlbCwgaW1wbGFudF90eXBlLCBob29rKSAlPiUNCiAgc2VwYXJhdGUoY29sID0gaW1wbGFudF90eXBlLCBpbnRvID0gYygic2lkZSIsICJkaXJlY3Rpb25faG9vayIsICJob29rX3R5cGUiLCAiaW1wbGFudF90eXBlIikpICU+JQ0KICBtdXRhdGUoaW1wbGFudCA9IHBhc3RlKHNpZGUsIGxldmVsLCBkaXJlY3Rpb25faG9vaywgaG9va190eXBlLCBpbXBsYW50X3R5cGUsIHNlcCA9ICJfIikpICU+JQ0KICBzZWxlY3QobGV2ZWwsIGltcGxhbnQsIGhvb2spICU+JQ0KICBsZWZ0X2pvaW4odmVydGVicmFsX251bWJlcl9kZikNCg0KdXBnb2luZ19sYW1pbmFyX2hvb2tzIDwtIGhvb2tfbGlzdF9kZiAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW1wbGFudCwgcGF0dGVybiA9ICJ1cGdvaW5nX2xhbWluYXIiKSkNCg0KdXBnb2luZ19ob29rc19jb2xsZWN0aW9uIDwtc3RfZ2VvbWV0cnljb2xsZWN0aW9uKHVwZ29pbmdfbGFtaW5hcl9ob29rcyRob29rKQ0KDQoNCmdnZHJhdygpICsNCiAgICAgIGRyYXdfaW1hZ2Uoc3BpbmVfcG5nLCBzY2FsZSA9IDEsIHkgPSAwLCB2YWxpZ24gPSAwLCB4ID0gMCwgd2lkdGggPSAxKSArDQogICAgICBkcmF3X3RleHQodGV4dCA9IGxhYmVsc19kZiRsYWJlbHMsIHggPSBsYWJlbHNfZGYkeF9sZWZ0LCB5ID0gbGFiZWxzX2RmJHksIHNpemUgPSAxMiwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgICAgIGRyYXdfdGV4dCh0ZXh0ID0gbGFiZWxzX2RmJGxhYmVscywgeCA9IGxhYmVsc19kZiR4X3JpZ2h0LCB5ID0gbGFiZWxzX2RmJHksIHNpemUgPSAxMiwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgICAgIGdlb21fcG9pbnQoYWVzKHggPSAwLjUgLSBpbGlhY194X29mZnNldCwgeSA9IGlsaWFjX3kpLCBzaXplID0gNCkgKyANCiAgZ2VvbV9wb2ludChhZXMoeCA9IDAuNSAtIHMyYWlfeF9vZmZzZXQsIHkgPSBzMmFpX3kpLCBzaXplID0gNCkgKyANCiAgZ2VvbV9zZihkYXRhID0gdXBnb2luZ19ob29rc19jb2xsZWN0aW9uLCBhbHBoYSA9IDAuNSkgKw0KICBnZ3BhdHRlcm46Omdlb21fc2ZfcGF0dGVybihkYXRhID0gczJhaV9zY3Jld19zY3Jld2hlYWQkbGVmdF9zY3Jld19zZiwgcGF0dGVybiA9ICJzdHJpcGUiLCAgcGF0dGVybl9maWxsID0gInJlZCIsYWxwaGEgPSAwLjgsIHBhdHRlcm5fY29sb3VyID0gImJsdWUiLCBwYXR0ZXJuX2RlbnNpdHkgPSAwLjAxLCBwYXR0ZXJuX3NwYWNpbmcgPSAwLjAwMywgYW5nbGUgPSA3MCkgKw0KICBnZ3BhdHRlcm46Omdlb21fc2ZfcGF0dGVybihkYXRhID0gczJhaV9zY3Jld19zY3Jld2hlYWQkcmlnaHRfc2NyZXdfc2YsIHBhdHRlcm4gPSAic3RyaXBlIiwgIHBhdHRlcm5fZmlsbCA9ICJyZWQiLGFscGhhID0gMC44LCBwYXR0ZXJuX2NvbG91ciA9ICJibHVlIiwgcGF0dGVybl9kZW5zaXR5ID0gMC4wMSwgcGF0dGVybl9zcGFjaW5nID0gMC4wMDMsIGFuZ2xlID0gNzApICsNCiAgdGhlbWVfbWluaW1hbF9ncmlkKCkgDQoNCmwzX3BlZGljbGVfeQ0KDQpgYGANCg0KYGBge3J9DQoNCiMgbGVmdF9zY3Jld19zdGFydF9jb29yZGluYXRlc19kZiA8LSByZWFkX2NzdihmaWxlID0gImNvb3JkaW5hdGVzX3NjcmV3X3N0YXJ0cy5jc3YiKQ0KIyANCiMgc2NyZXdfc3RhcnRfY29vcmRpbmF0ZXNfZGYgPC0gbGVmdF9zY3Jld19zdGFydF9jb29yZGluYXRlc19kZiAlPiUNCiMgICBtdXRhdGUoeCA9IDEgLSB4LCBzaWRlID0gInJpZ2h0IikgJT4lDQojICAgdW5pb25fYWxsKGxlZnRfc2NyZXdfc3RhcnRfY29vcmRpbmF0ZXNfZGYpICU+JQ0KIyAgIG11dGF0ZSh4ID0gcm91bmQoeCwgMiksIHkgPSByb3VuZCh5LCAyKSkNCg0Kc2NyZXdfc3RhcnRfY29vcmRpbmF0ZXNfZGYNCg0KaW1wbGFudHNfZGYgPC0gc2NyZXdfc3RhcnRfY29vcmRpbmF0ZXNfZGYgJT4lDQogICMgZmlsdGVyKGxldmVsID09ICJsMyIsIHNpZGUgPT0gImxlZnQiKSAlPiUNCiAgbXV0YXRlKGltcGxhbnRfY29uc3RydWN0ZWQgPSBwbWFwKGxpc3QoLi4xID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uMiA9IHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uMyA9IGFuZ2xlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi40ID0gbGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjUgPSB3aWR0aCksIC5mID0gfiBzY3Jld19mdW5jdGlvbl8yKHNjcmV3X3R5cGUgPSAicGVkaWNsZSIsIHNjcmV3X3N0YXJ0X3ggPSAuLjEsIHNjcmV3X3N0YXJ0X3kgPSAuLjIsIGFuZ2xlID0gLi4zLCBzY3Jld19sZW5ndGhfbW9kaWZpZXIgPSAuLjQsIHNjcmV3X3dpZHRoX21vZGlmaWVyID0gLi41KSkpDQoNCg0KIyBpbXBsYW50c19kZiANCg0KDQppbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgdGFieWwoaW1wbGFudCkNCg0KYGBgDQpgYGB7cn0NCmltcGxhbnRfc3RhcnRzX2RmIDwtIHJlYWRfY3N2KGZpbGUgPSAiY29vcmRpbmF0ZXNfc2NyZXdfc3RhcnRzLmNzdiIpIA0KDQpsNF9wZWRpY2xlX3NjcmV3X2RmIDwtIGltcGxhbnRfc3RhcnRzX2RmJT4lDQogIGZpbHRlcihpbXBsYW50ID09ICJwZWRpY2xlX3NjcmV3Iiwgc2lkZSA9PSAibGVmdCIsIGxldmVsID09ICJsNCIpICU+JQ0KICBtdXRhdGUoaW1wbGFudF9jb25zdHJ1Y3RlZCA9IHBtYXAobGlzdCguLjEgPSB4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjIgPSB5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjMgPSBhbmdsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi40ID0gbGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjUgPSB3aWR0aCksIC5mID0gfiBzY3Jld19mdW5jdGlvbihzY3Jld19zdGFydF94ID0gLi4xLCBzY3Jld19zdGFydF95ID0gLi4yLCBhbmdsZSA9IC4uMywgc2NyZXdfbGVuZ3RoX21vZGlmaWVyID0gLi40LCBzY3Jld193aWR0aF9tb2RpZmllciA9IC4uNSkpKSANCg0KDQpsNDVfcGVkaWNsZV9zY3Jld19kZiA8LSBpbXBsYW50X3N0YXJ0c19kZiU+JQ0KICBmaWx0ZXIoaW1wbGFudCA9PSAicGVkaWNsZV9zY3JldyIsIHNpZGUgPT0gImxlZnQiLCBsZXZlbCAlaW4lIGMoImw0IiwgImw1IikpICU+JQ0KICBtdXRhdGUoaW1wbGFudF9jb25zdHJ1Y3RlZCA9IHBtYXAobGlzdCguLjEgPSB4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjIgPSB5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjMgPSBhbmdsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi40ID0gbGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjUgPSB3aWR0aCksIC5mID0gfiBzY3Jld19mdW5jdGlvbihzY3Jld19zdGFydF94ID0gLi4xLCBzY3Jld19zdGFydF95ID0gLi4yLCBhbmdsZSA9IC4uMywgc2NyZXdfbGVuZ3RoX21vZGlmaWVyID0gLi40LCBzY3Jld193aWR0aF9tb2RpZmllciA9IC4uNSkpKSANCg0KcG9pbnQgPC0gc3RfcG9pbnQoYyhsNF9wZWRpY2xlX3NjcmV3X2RmJHhbWzFdXSwgbDRfcGVkaWNsZV9zY3Jld19kZiR5W1sxXV0pKQ0KDQpsNDVfcGVkaWNsZV9zY3Jld19kZiAlPiUNCiAgbXV0YXRlKHBvaW50X3RvdWNoZXMgPSBtYXBfbGdsKC54ID0gaW1wbGFudF9jb25zdHJ1Y3RlZCwgLmYgPSB+IHN0X2NvbnRhaW5zKHggPSAueCwgeSA9IHBvaW50LCBzcGFyc2UgPSBGQUxTRSkpKSAlPiUNCiAgZmlsdGVyKHBvaW50X3RvdWNoZXMgPT0gRkFMU0UpDQoNCnBvaW50IDwtIHN0X3BvaW50KGMobDRfcGVkaWNsZV9zY3Jld19kZiR4W1sxXV0sIGw0X3BlZGljbGVfc2NyZXdfZGYkeVtbMV1dKSkNCg0Kc2NyZXdfdG9fdGVzdCA8LSBsNF9wZWRpY2xlX3NjcmV3X2RmJGltcGxhbnRfY29uc3RydWN0ZWRbWzFdXQ0KDQpzdF9jb250YWlucyh4ID0gc2NyZXdfdG9fdGVzdCwgeSA9IHBvaW50LCBzcGFyc2UgPSBGQUxTRSlbWzFdXQ0KDQpzdF9jb250YWlucygpDQoNCmdncGxvdCgpICsgDQogIGdlb21fc2YoZGF0YSA9IHNjcmV3X3RvX3Rlc3QpICsgDQogIGdlb21fc2YoZGF0YSA9IHBvaW50KQ0KDQpgYGANCg0KDQpgYGB7cn0NCmltcGxhbnRfc3RhcnRzX2RmIDwtIHJlYWRfY3N2KGZpbGUgPSAiY29vcmRpbmF0ZXNfc2NyZXdfc3RhcnRzLmNzdiIpDQoNCiMgc2NyZXdzX2RmIDwtIGltcGxhbnRfc3RhcnRzX2RmICU+JQ0KIyAgIGZpbHRlcihpbXBsYW50ICE9ICJ0cF9ob29rIikgJT4lDQojICAgbXV0YXRlKGltcGxhbnRfY29uc3RydWN0ZWQgPSBwbWFwKGxpc3QoLi4xID0geCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4yID0geSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjMgPSBhbmdsZSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi40ID0gbGVuZ3RoLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uNSA9IHdpZHRoKSwgLmYgPSB+IHNjcmV3X2Z1bmN0aW9uKHNjcmV3X3N0YXJ0X3ggPSAuLjEsIHNjcmV3X3N0YXJ0X3kgPSAuLjIsIGFuZ2xlID0gLi4zLCBzY3Jld19sZW5ndGhfbW9kaWZpZXIgPSAuLjQsIHNjcmV3X3dpZHRoX21vZGlmaWVyID0gLi41KSkpDQojIA0KIyBob29rc19kZiA8LSBpbXBsYW50X3N0YXJ0c19kZiAlPiUNCiMgICBmaWx0ZXIoaW1wbGFudCA9PSAidHBfaG9vayIpICU+JQ0KIyAgIHJlbW92ZV9lbXB0eSgpICU+JQ0KIyAgICAgICAgICAgICAgICAgICBtdXRhdGUoaW1wbGFudF9jb25zdHJ1Y3RlZCA9IHBtYXAobGlzdCguLjEgPSB4LCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uMiA9IHkpLCAuZiA9IH4gaG9va190cF9mdW5jdGlvbihob29rX3N0YXJ0X3ggPSAuLjEsIGhvb2tfZWRnZV95ID0gLi4yKSkpDQojIA0KIyANCg0KaG9va3NfdXBnb2luZ19kZiA8LSBpbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgZmlsdGVyKGltcGxhbnQgPT0gImxhbWluYXJfdXBnb2luZ19ob29rIikgJT4lDQogIHJlbW92ZV9lbXB0eSgpICU+JQ0KICAgICAgICAgICAgICAgICAgbXV0YXRlKGltcGxhbnRfY29uc3RydWN0ZWQgPSBwbWFwKGxpc3QoLi4xID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4yID0geSksIC5mID0gfiBob29rX2xhbWluYXJfZnVuY3Rpb24oaG9va19kaXJlY3Rpb24gPSAidXBnb2luZyIsIGhvb2tfc3RhcnRfeCA9IC4uMSwgaG9va19lZGdlX3kgPSAuLjIpKSkNCg0KDQpob29rc19kb3duZ29pbmdfZGYgPC0gaW1wbGFudF9zdGFydHNfZGYgJT4lDQogIGZpbHRlcihpbXBsYW50ID09ICJsYW1pbmFyX2Rvd25nb2luZ19ob29rIikgJT4lDQogIHJlbW92ZV9lbXB0eSgpICU+JQ0KICAgICAgICAgICAgICAgICAgbXV0YXRlKGltcGxhbnRfY29uc3RydWN0ZWQgPSBwbWFwKGxpc3QoLi4xID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4yID0geSksIC5mID0gfiBob29rX2xhbWluYXJfZnVuY3Rpb24oaG9va19kaXJlY3Rpb24gPSAiZG93bmdvaW5nIiwgaG9va19zdGFydF94ID0gLi4xLCBob29rX2VkZ2VfeSA9IC4uMikpKQ0KDQoNCmltcGxhbnRfZmlndXJlcyA8LSBzdF9tdWx0aXBvbHlnb24oaG9va3NfdXBnb2luZ19kZiRpbXBsYW50X2NvbnN0cnVjdGVkKQ0KDQpzY3Jld3NfZmlndXJlcyA8LSBzdF9tdWx0aXBvbHlnb24oc2NyZXdzX2RmJGltcGxhbnRfY29uc3RydWN0ZWQpDQoNCmdnZHJhdygpICsNCiAgICAgIGRyYXdfaW1hZ2Uoc3BpbmVfcG5nLCBzY2FsZSA9IDEsIHkgPSAwLCB2YWxpZ24gPSAwLCB4ID0gMCwgd2lkdGggPSAxKSArDQogICAgICBkcmF3X3RleHQodGV4dCA9IGxhYmVsc19kZiRsYWJlbHMsIHggPSAwLjQ1LCB5ID0gbGFiZWxzX2RmJHksIHNpemUgPSAxMiwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgICAgIGRyYXdfdGV4dCh0ZXh0ID0gbGFiZWxzX2RmJGxhYmVscywgeCA9IGxhYmVsc19kZiR4X3JpZ2h0LCB5ID0gbGFiZWxzX2RmJHksIHNpemUgPSAxMiwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgICAgIGdlb21fcG9pbnQoYWVzKHggPSAwLjUgLSBpbGlhY194X29mZnNldCwgeSA9IGlsaWFjX3kpLCBzaXplID0gNCkrDQogIGdlb21fc2YoZGF0YSA9IGltcGxhbnRfZmlndXJlcykgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICAjIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoZnJvbSA9IDAsIHRvID0gMSwgYnkgPSAwLjA1KSwgbGFiZWxzID0gc2VxKGZyb20gPSAwLCB0byA9IDEsIGJ5ID0gMC4wNSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gc2VxKGZyb20gPSAwLjIsIHRvID0gMC45LCBieSA9IDAuMDEpLCBjb2xvciA9ICJncmV5Iiwgc2l6ZSA9IDAuMDEpICsNCiAgIyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBzZXEoZnJvbSA9IDAuNCwgdG8gPSAwLjYsIGJ5ID0gMC4wMSksIGNvbG9yID0gImdyZXkiKSArDQogICMgeWxpbSgwLjcsIDEpICsNCiAgeGxpbSgwLjQsIDAuNikNCg0KDQoNCmltcGxhbnRzX2FsbF9kZiA8LSBpbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgbGVmdF9qb2luKHZlcnRlYnJhbF9udW1iZXJfZGYpICU+JQ0KICBtdXRhdGUodmVydGVicmFsX251bWJlciA9IGFzLmRvdWJsZSh2ZXJ0ZWJyYWxfbnVtYmVyKSkgJT4lDQogIG11dGF0ZSh2ZXJ0ZWJyYWxfbnVtYmVyID0gaWZfZWxzZShsZXZlbCA9PSAiczJhaSIsIDI4LCB2ZXJ0ZWJyYWxfbnVtYmVyKSkgJT4lDQogIGdyb3VwX2J5KGltcGxhbnQsIHNpZGUpICU+JQ0KICBtdXRhdGUoaW1wbGFudF9udW1iZXIgPSByb3dfbnVtYmVyKCkpICU+JQ0KICBhcnJhbmdlKHZlcnRlYnJhbF9udW1iZXIsIGltcGxhbnRfbnVtYmVyKQ0KDQogDQppbXBsYW50c19hbGxfZGYgPC0gdmVydGVicmFsX251bWJlcl9kZiAlPiUNCiAgbGVmdF9qb2luKGltcGxhbnRfc3RhcnRzX2RmKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNpZGUsIHZhbHVlc19mcm9tID0geCkgJT4lDQogIG11dGF0ZShpbXBsYW50ID0gYXNfZmFjdG9yKGltcGxhbnQpKSAlPiUNCiAgbXV0YXRlKGltcGxhbnQgPSBmY3RfcmVsZXZlbChpbXBsYW50LCBjKCJvY2NpcGl0YWxfc2NyZXciLCAicGVkaWNsZV9zY3JldyIsICJwZWx2aWNfc2NyZXciLCAicGFyc19zY3JldyIsICJsYXRlcmFsX21hc3Nfc2NyZXciLCAidHJhbnNsYW1pbmFyX3NjcmV3IiwgImxhbWluYXJfZG93bmdvaW5nX2hvb2siLCAibGFtaW5hcl91cGdvaW5nX2hvb2siLCAidHBfaG9vayIpKSklPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGxlZnQsIHJpZ2h0KSwgbmFtZXNfdG8gPSAic2lkZSIsIHZhbHVlc190byA9ICJ4IikgJT4lDQogICAgYXJyYW5nZShzaWRlLCBpbXBsYW50KSAlPiUNCiAgcmVtb3ZlX2VtcHR5KCkgJT4lDQogIHNlbGVjdChsZXZlbCwgdmVydGVicmFsX251bWJlciwgaW1wbGFudCwgc2lkZSwgeCwgeSwgYW5nbGUsIGxlbmd0aCwgd2lkdGgpDQogIA0KDQppbXBsYW50c19hbGxfZGYNCg0KDQogIA0KICBpbXBsYW50X2ZhY3RvciA8LSBjKCJvY2NpcGl0YWxfc2NyZXciLCAicGVkaWNsZV9zY3JldyIsICJwZWx2aWNfc2NyZXciLCAicGFyc19zY3JldyIsICJsYXRlcmFsX21hc3Nfc2NyZXciLCAidHJhbnNsYW1pbmFyX3NjcmV3IiwgImxhbWluYXJfZG93bmdvaW5nX2hvb2siLCAibGFtaW5hcl91cGdvaW5nX2hvb2siLCAidHBfaG9vayIpDQoNCmBgYA0KYGBge3J9DQoNCmltcGxhbnRzX3dpZGVfZGYgPC0gaW1wbGFudF9zdGFydHNfZGYgJT4lDQogIHNlbGVjdChsZXZlbCwgaW1wbGFudCwgc2lkZSkgJT4lDQogIGZpbHRlcihpbXBsYW50ID09ICJwZWRpY2xlX3NjcmV3IikgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzaWRlLCB2YWx1ZXNfZnJvbSA9IGltcGxhbnQpDQoNCnN1bShzdHJfY291bnQoc3RyaW5nID0gaW1wbGFudHNfd2lkZV9kZiRsZXZlbCwgcGF0dGVybiA9ICJsMSIpKQ0KDQpzdHJfZGV0ZWN0KHN0cmluZyA9IHByaW50KGNhdChpbXBsYW50c193aWRlX2RmJGxldmVsKSksIHBhdHRlcm4gPSAidDEyIikNCg0KdmVjdG9yIDwtIFJlZHVjZShwYXN0ZSwgaW1wbGFudHNfd2lkZV9kZiRsZXZlbCkNCg0KdmVjdG9yDQoNCnN0cl9jb3VudChzdHJpbmcgPSBSZWR1Y2UocGFzdGUsIGltcGxhbnRzX3dpZGVfZGYkbGV2ZWwpLCBwYXR0ZXJuID0gInMyIikNCg0KICAgIG1ha2VfdWkgPC0gIGZ1bmN0aW9uKHNjcmV3X2xldmVsLCBzZWxlY3RlZCA9IE5VTEwpew0KICAgICAgICBzY3Jld19sYWJlbCA8LSBzdHJfcmVwbGFjZV9hbGwoc3RyaW5nID0gc2NyZXdfbGV2ZWwsIHBhdHRlcm4gPSAiXyIsIHJlcGxhY2VtZW50ID0gIiAiKQ0KICAgICAgICANCiAgICAgICAgc2NyZXdfbGFiZWwgPC0gc3RyX3RvX3RpdGxlKHNjcmV3X2xhYmVsKQ0KICAgICAgICANCiAgICAgICAgcmFkaW9Hcm91cEJ1dHRvbnMoDQogICAgICAgICAgICBpbnB1dElkID0gc2NyZXdfbGV2ZWwsDQogICAgICAgICAgICBsYWJlbCA9IHNjcmV3X2xhYmVsLA0KICAgICAgICAgICAgY2hvaWNlcyA9IGMoIlBvbHkiLCAiVW5pIiwgIk1vbm8iLCAiUmVkdWN0aW9uIiksDQogICAgICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkLCANCiAgICAgICAgICAgIHNpemUgPSAieHMiDQogICAgICAgICl9DQoNCmxldmVsX3NpZGVfZGYgPC0gaW1wbGFudF9zdGFydHNfZGYgJT4lDQogICAgICAgICAgICBzZWxlY3QodmVydGVicmFsX251bWJlciwgbGV2ZWwsIHNpZGUsIGltcGxhbnQpICU+JQ0KICAgICAgICAgICAgZmlsdGVyKGltcGxhbnQgPT0gInBlZGljbGVfc2NyZXciKSAlPiUNCiAgICAgICAgICAgIG11dGF0ZShsZXZlbF9zaWRlID0gcGFzdGUobGV2ZWwsIHNpZGUsIGltcGxhbnQsIHNlcCA9ICJfIikpICU+JQ0KICAgICAgICAgICAgc2VsZWN0KHZlcnRlYnJhbF9udW1iZXIsIGxldmVsLCBzaWRlLCBsZXZlbF9zaWRlLCBpbXBsYW50KSAlPiUNCiAgICAgICAgICAgIGFycmFuZ2UodmVydGVicmFsX251bWJlcikNCg0KDQp1aV93aWRlX2RmIDwtIGxldmVsX3NpZGVfZGYgJT4lDQogIGZpbHRlcihsZXZlbF9zaWRlICE9ICJjM19yaWdodF9wZWRpY2xlX3NjcmV3IikgJT4lDQogIG11dGF0ZShpbnB1dF91ID0gbWFwKC54ID0gbGV2ZWxfc2lkZSwgLmYgPSB+bWFrZV91aShzY3Jld19sZXZlbCA9IC54KSkpICU+JQ0KICBzZWxlY3QobGV2ZWwsIHNpZGUsIGlucHV0X3UpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gc2lkZSwgdmFsdWVzX2Zyb20gPSBpbnB1dF91KQ0KDQp1aV93aWRlX2RmICU+JQ0KICBtdXRhdGUocmlnaHRfbnVsbCA9IG1hcCgueCA9IHJpZ2h0LCAuZiA9IH5sZW5ndGgoLngpKSkgJT4lDQogIHVubmVzdChyaWdodF9udWxsKSAlPiUNCiAgbXV0YXRlKHJpZ2h0ID0gbWFwKC54ID0gcmlnaHQsIC5mID0gfmlmX2Vsc2UocmlnaHRfbnVsbCA9PSAwLCAsICgueCkpKSkNCg0KbGVuZ3RoKHVpX3dpZGVfZGYkbGVmdCkNCg0Kc3VtbWFyeSh1aV93aWRlX2RmJHJpZ2h0WzFdKQ0KDQoNCg0KbGVuZ3RoKHVpX3dpZGVfZGYkcmlnaHRbXVtbMV1dKQ0KDQp1aV93aWRlX2RmDQppc192ZWN0b3IodWlfd2lkZV9kZikNCg0KbGV2ZWxfc2lkZV9kZiAlPiUNCiAgZmlsdGVyKGxldmVsX3NpZGUgIT0gImMyX2xlZnRfcGVkaWNsZV9zY3JldyIpICU+JQ0KICAgICAgICAgICAgc2VsZWN0KGxldmVsX3NpZGUsIHNpZGUsIHZlcnRlYnJhbF9udW1iZXIpICU+JQ0KICAgICAgICAgICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNpZGUsIHZhbHVlc19mcm9tID0gbGV2ZWxfc2lkZSkgDQoNCnRlc3RfZGYgPC0gbGV2ZWxfc2lkZV9kZiAlPiUNCiAgZmlsdGVyKGxldmVsX3NpZGUgJWluJSBjKCJ0OV9yaWdodF9wZWRpY2xlX3NjcmV3IiwgInQxMF9yaWdodF9wZWRpY2xlX3NjcmV3IiwgInQxMF9sZWZ0X3BlZGljbGVfc2NyZXciLCAidDExX2xlZnRfcGVkaWNsZV9zY3JldyIpKSAlPiUNCiAgICAgICAgICAgIHNlbGVjdCh2ZXJ0ZWJyYWxfbnVtYmVyLCBsZXZlbF9zaWRlLCBzaWRlKSAlPiUNCiAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzaWRlLCB2YWx1ZXNfZnJvbSA9IGxldmVsX3NpZGUpDQoNCg0KdGVzdF9kZg0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KICAgIG1ha2VfdWlfcm93cyA8LSAgZnVuY3Rpb24obGVmdF9zY3Jld19sZXZlbCA9IE5VTEwsIHJpZ2h0X3NjcmV3X2xldmVsID0gTlVMTCwgbGVmdF9zZWxlY3RlZCA9IE5VTEwsIHJpZ2h0X3NlbGVjdGVkID0gTlVMTCl7DQogICAgICAgICMjTEVGVA0KICAgICAgICBsZWZ0X3NjcmV3X2xhYmVsIDwtIHN0cl9yZXBsYWNlX2FsbChzdHJpbmcgPSBsZWZ0X3NjcmV3X2xldmVsLCBwYXR0ZXJuID0gIl8iLCByZXBsYWNlbWVudCA9ICIgIikNCiAgICAgICAgDQogICAgICAgIGxlZnRfc2NyZXdfbGFiZWwgPC0gc3RyX3RvX3RpdGxlKGxlZnRfc2NyZXdfbGFiZWwpDQogICAgICAgICMjIFJJR0hUDQogICAgICAgIHJpZ2h0X3NjcmV3X2xhYmVsIDwtIHN0cl9yZXBsYWNlX2FsbChzdHJpbmcgPSByaWdodF9zY3Jld19sZXZlbCwgcGF0dGVybiA9ICJfIiwgcmVwbGFjZW1lbnQgPSAiICIpDQogICAgICAgIA0KICAgICAgICByaWdodF9zY3Jld19sYWJlbCA8LSBzdHJfdG9fdGl0bGUocmlnaHRfc2NyZXdfbGFiZWwpDQogICAgICAgIA0KICAgICAgICBmaXhlZFJvdygNCiAgICAgICAgICAgIGNvbHVtbih3aWR0aCA9IDEyLA0KICAgICAgICAgICAgICAgICAgIGlmKCFpcy5udWxsKGxlZnRfc2NyZXdfbGV2ZWwpKXsNCiAgICAgICAgICAgICAgICAgICByYWRpb0dyb3VwQnV0dG9ucygNCiAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJZCA9IGxlZnRfc2NyZXdfbGV2ZWwsDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGVmdF9zY3Jld19sYWJlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcyA9IGMoIlBvbHkiLCAiVW5pIiwgIk1vbm8iLCAiUmVkdWN0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gbGVmdF9zZWxlY3RlZCwgDQogICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAieHMiDQogICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGlmKCFpcy5udWxsKHJpZ2h0X3NjcmV3X2xldmVsKSl7DQogICAgICAgICAgICBjb2x1bW4od2lkdGggPSAxMiwNCiAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9Hcm91cEJ1dHRvbnMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dElkID0gcmlnaHRfc2NyZXdfbGV2ZWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHJpZ2h0X3NjcmV3X2xhYmVsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcyA9IGMoIlBvbHkiLCAiVW5pIiwgIk1vbm8iLCAiUmVkdWN0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHJpZ2h0X3NlbGVjdGVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAieHMiDQogICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgDQogICAgICAgICkNCiAgICAgICAgDQogICAgfQ0KDQp0ZXN0X2RmIDwtIGxldmVsX3NpZGVfZGYgJT4lDQogIGZpbHRlcihsZXZlbF9zaWRlICVpbiUgYygidDlfcmlnaHRfcGVkaWNsZV9zY3JldyIsICJ0MTBfcmlnaHRfcGVkaWNsZV9zY3JldyIsICJ0MTBfbGVmdF9wZWRpY2xlX3NjcmV3IiwgInQxMV9sZWZ0X3BlZGljbGVfc2NyZXciKSkgJT4lDQogICAgICAgICAgICBzZWxlY3QodmVydGVicmFsX251bWJlciwgbGV2ZWxfc2lkZSwgc2lkZSkgJT4lDQogICAgICAgICAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gc2lkZSwgdmFsdWVzX2Zyb20gPSBsZXZlbF9zaWRlKQ0KICAjIG11dGF0ZSh1aV9waWMgPSBsaXN0KG1ha2VfdWlfcm93cyhsZWZ0X3NjcmV3X2xldmVsID0gbGVmdCwgcmlnaHRfc2NyZXdfbGV2ZWwgPSByaWdodCkpKQ0KDQoNCg0KbXV0YXRlKHggPSBpZl9lbHNlKGlzX3ZlY3Rvcih0ZXN0X2RmJGxlZnQpLCBsZWZ0LCAibm8iKSkNCg0KaXNfdmVjdG9yKHRlc3RfZGYkcmlnaHQpDQoNCmlmKGlzX3ZlY3Rvcih0ZXN0X2RmJHJpZ2h0KSl7DQogIHJpZ2h0X3YgPC0gdGVzdF9kZiRyaWdodA0KfWVsc2V7DQogIHJpZ2h0X3YgPC0gTlVMTA0KfQ0KDQppZihpc192ZWN0b3IodGVzdF9kZiRsZWZ0KSl7DQogIGxlZnRfdiA8LSB0ZXN0X2RmJGxlZnQNCn1lbHNlew0KICBsZWZ0X3YgPC0gTlVMTA0KfQ0KDQoNCnRlc3RfbGlzdCA8LSBwbWFwKC5sID0gbGlzdCguLjEgPSBsZWZ0X3YsDQogICAgICAgICAgICAgICAgICAgICAgIC4uMiA9IHJpZ2h0X3YpLA0KICAgICAgICAgICAgIC5mID0gfm1ha2VfdWlfcm93cyhsZWZ0X3NjcmV3X2xldmVsID0gLi4xLCByaWdodF9zY3Jld19sZXZlbCA9IC4uMiwgbGVmdF9zZWxlY3RlZCA9IE5VTEwsIHJpZ2h0X3NlbGVjdGVkID0gTlVMTCkpDQoNCnRlc3RfbGlzdA0KDQpzdF9sb25nIDwtIGltcGxhbnRfc3RhcnRzX2RmICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QodmVydGVicmFsX251bWJlciwgbGV2ZWwsIHNpZGUsIGltcGxhbnQpICU+JQ0KICAgICAgICAgICAgZmlsdGVyKGltcGxhbnQgPT0gInBlZGljbGVfc2NyZXciKSAlPiUNCiAgICAgICAgICAgIGRpc3RpbmN0KCkgJT4lDQogICAgICAgICAgICBtdXRhdGUobGV2ZWxfc2lkZSA9IHBhc3RlKGxldmVsLCBzaWRlLCBpbXBsYW50LCBzZXAgPSAiXyIpKSAlPiUNCiAgICAgICAgICAgIHNlbGVjdCh2ZXJ0ZWJyYWxfbnVtYmVyLCBsZXZlbCwgc2lkZSwgbGV2ZWxfc2lkZSwgaW1wbGFudCkgJT4lDQogICAgICAgICAgICBhcnJhbmdlKHZlcnRlYnJhbF9udW1iZXIpICU+JQ0KICAgICAgICAgICAgc2VsZWN0KHZlcnRlYnJhbF9udW1iZXIsIGxldmVsLCBsZXZlbF9zaWRlLCBzaWRlKQ0KDQpzdF9sb25nJHNpZGVbImxlZnQiXQ0KDQptYXRjaCh4ID0gImxlZnQiLCB0YWJsZSA9IHN0X2xvbmckc2lkZSkNCg0KICAgICAgICBwbWFwKC5sID0gbGlzdCguLjEgPSAoaW1wbGFudF9zdGFydHNfZGYgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgLi4yID0gbGVmdF92ZWN0b3IsDQogICAgICAgICAgICAgICAgICAgICAgIC4uMyA9IHJpZ2h0X3ZlY3RvciksDQogICAgICAgICAgICAgICAgICAgICAgICAgIC5mID0gfm1ha2VfdWlfcm93cyhsZXZlbCA9IC4uMSwgbGVmdF9zY3Jld19sZXZlbCA9IC4uMiwgcmlnaHRfc2NyZXdfbGV2ZWwgPSAuLjMsIGxlZnRfc2VsZWN0ZWQgPSBOVUxMLCByaWdodF9zZWxlY3RlZCA9IE5VTEwpKQ0KICAgICAgICANCg0KZ2x1ZV9jb2xsYXBzZShuYW1lcyhpbXBsYW50X3N0YXJ0c19kZiksIHNlcCA9ICIgIikNCiAgICAgICAgICAgICAgICANCmlmKHN0cl9kZXRlY3Qoc3RyaW5nID0gZ2x1ZV9jb2xsYXBzZShuYW1lcyhpbXBsYW50X3M1NHRhcnRzX2RmKSksIHBhdHRlcm4gPSAibGV2ZWwiKSl7DQogIHByaW50KCJmYWxzZWx5IHByaW50aW5nIikNCn1lbHNlew0KICBwcmludCgiY29ycmVjdCIpDQp9DQogIHN0cl9kZXRlY3Qoc3RyaW5nID0gZ2x1ZV9jb2xsYXBzZShuYW1lcyhpbXBsYXNzbnRfc3RhcnRzX2RmKSksIHBhdHRlcm4gPSAibGV2ZWwiKSAgDQogIA0KICBpbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgICBzZWxlY3QobGV2ZWwsIGltcGxhbnQsIHNpZGUpICU+JQ0KICAgIGZpbHRlcihpbXBsYW50ID09ICJwZWRpY2xlX3NjcmV3IikgJT4lDQogICAgbXV0YXRlKHNpZGVfaXNfbGVmdCA9IHN0cl9kZXRlY3Qoc2lkZSwgImxlZnQiKSkgJT4lDQogICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNpZGUsIHZhbHVlc19mcm9tID0gaW1wbGFudCkNCiAgICANCiB0ZXN0X2RmIDwtICBpbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgICBzZWxlY3QodmVydGVicmFsX251bWJlciwgbGV2ZWwsIHNpZGUsIGltcGxhbnQpICU+JQ0KICAgIGZpbHRlcihpbXBsYW50ID09ICJwZWRpY2xlX3NjcmV3IikgJT4lDQogICAgZGlzdGluY3QoKSAlPiUNCiAgICBtdXRhdGUobGV2ZWxfc2lkZSA9IHBhc3RlKGxldmVsLCBzaWRlLCBpbXBsYW50LCBzZXAgPSAiXyIpKSAlPiUNCiAgICBmaWx0ZXIobGV2ZWxfc2lkZSAlaW4lIGMoImMyX2xlZnRfcGVkaWNsZV9zY3JldyIsICJjM19sZWZ0X3BlZGljbGVfc2NyZXciLCAiYzNfcmlnaHRfcGVkaWNsZV9zY3JldyIsICJjNF9yaWdodF9wZWRpY2xlX3NjcmV3IikpICU+JQ0KICBhcnJhbmdlKHZlcnRlYnJhbF9udW1iZXIpICU+JQ0KICAgIHNlbGVjdChsZXZlbCwgdmVydGVicmFsX251bWJlciwgbGV2ZWxfc2lkZSwgc2lkZSkgJT4lDQogICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNpZGUsIHZhbHVlc19mcm9tID0gbGV2ZWxfc2lkZSkNCiAgDQogDQp0ZXN0X2RmICU+JQ0KICBtdXRhdGUocmlnaHQgPSBpZl9lbHNlKGlzLm5hKHJpZ2h0KSwgIm5vX3NjcmV3IiwgcmlnaHQpKQ0KIA0KZGZ0ZXN0X25hbWVzIDwtIGdsdWVfY29sbGFwc2UobmFtZXModGVzdF9kZiksIHNlcCA9ICIgIikNCmRmdGVzdF9uYW1lcw0KDQppZihzdHJfZGV0ZWN0KHN0cmluZyA9IGRmdGVzdF9uYW1lcywgcGF0dGVybiA9ICJyaWdodCIpKXsNCiAgcHJpbnQoImlkJ2QgbmFtZXMgY29ycmVjdGx5IikNCn1lbHNlew0KICB0ZXN0IDwtIHRlc3RfZGYgJT4lDQogICAgbXV0YXRlKHJpZ2h0ICkNCn0NCg0KDQoNCg0KYGBgDQoNCg0KYGBge3J9DQppbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgYXJyYW5nZSh2ZXJ0ZWJyYWxfbnVtYmVyKQ0KDQppbXBsYW50X3N0YXJ0c19kZiRsZXZlbFtbMV1dDQoNCnRlc3QgPC0gaW1wbGFudF9zdGFydHNfZGYgJT4lDQogIHNlbGVjdChsZXZlbCwgdmVydGVicmFsX251bWJlcikgJT4lDQogIGRpc3RpbmN0KCkgJT4lDQogIGFycmFuZ2UodmVydGVicmFsX251bWJlcikgJT4lDQogIG11dGF0ZShsZXZlbCA9IGZjdF9pbm9yZGVyKGxldmVsKSkNCg0KdGVzdA0KdGFpbCh0ZXN0JGxldmVsLCBuID0gMSkNCg0KbGVmdF9wcmltYXJ5X3JvZCA8LSAgYygidDEwIiwgImwzIikNCg0KbGVmdF9wcmltYXJ5X3JvZFtbMl1dDQoNCnJhbmdlIDwtIHZlcnRlYnJhbF9udW1iZXJfZGYgJT4lDQogIG11dGF0ZSh1aXYgPSBsZWZ0X3ByaW1hcnlfcm9kWzFdKSAlPiUNCiAgbXV0YXRlKGxpdiA9IGxlZnRfcHJpbWFyeV9yb2RbMl0pICU+JQ0KICBmaWx0ZXIobGV2ZWwgPT0gdWl2IHwgbGV2ZWwgPT0gbGl2KSAlPiUNCiAgZGlzdGluY3QoKQ0KDQpyYW5nZQ0KaXNfZG91YmxlKHVwcGVyX3JvZF9sZXZlbCkNCg0KdXBwZXJfcm9kX2xldmVsIDwtIG1hdGNoKHggPSBsZWZ0X3ByaW1hcnlfcm9kW1sxXV0sIHRhYmxlID0gdmVydGVicmFsX251bWJlcl9kZiRsZXZlbCkNCmxvd2VyX3JvZF9sZXZlbCA8LSBtYXRjaCh4ID0gbGVmdF9wcmltYXJ5X3JvZFtbMl1dLCB0YWJsZSA9IHZlcnRlYnJhbF9udW1iZXJfZGYkbGV2ZWwpDQoNCnZlcnRlYnJhbF9udW1iZXJfZGYgJT4lDQogIGZpbHRlcihiZXR3ZWVuKHZlcnRlYnJhbF9udW1iZXIsIHVwcGVyX3JvZF9sZXZlbCwgbG93ZXJfcm9kX2xldmVsKSkNCiAgDQogIGZpbHRlcihiZXR3ZWVuKHZlcnRlYnJhbF9udW1iZXIsIG1pbihyYW5nZSR2ZXJ0ZWJyYWxfbnVtYmVyKSwgbWF4KHJhbmdlJHZlcnRlYnJhbF9udW1iZXIpKSkNCg0KdmVydGVicmFsX251bWJlcl9kZiRsZXZlbFsidDEwIjoibDIiXQ0KDQp2ZXJ0ZWJyYWxfbnVtYmVyX2RmDQoNCiAgICAgICAgdXBwZXJfcm9kX2xldmVsIDwtIG1hdGNoKHggPSBpbnB1dCRsZWZ0X3ByaW1hcnlfcm9kW1sxXV0sIHRhYmxlID0gbGVmdF9yb2RfcmFuZ2VfZGYkbGV2ZWwpDQogICAgICAgIA0KICAgICAgICBsb3dlcl9yb2RfbGV2ZWwgPC0gbWF0Y2goeCA9IGlucHV0JGxlZnRfcHJpbWFyeV9yb2RbWzJdXSwgdGFibGUgPSBsZWZ0X3JvZF9yYW5nZV9kZiRsZXZlbCkNCiAgICAgICAgDQogICAgICAgIGxlZnRfcm9kX21hdHJpeCA8LSB0aWJibGUobGV2ZWwgPSBsZWZ0X3JvZF9yYW5nZV9kZiRsZXZlbCkgJT4lDQogICAgICAgICAgICBsZWZ0X2pvaW4obGVmdF9yb2RfcmFuZ2VfZGYpICU+JQ0KICAgICAgICAgICAgc2VsZWN0KHgsIHkpICU+JQ0KICAgICAgICAgICAgYXMubWF0cml4KCkNCiAgICAgICAgDQogICAgICAgIA0KaW1wbGFudF9zdGFydHNfZGYgJT4lDQogIGZpbHRlcihzaWRlID09ICJsZWZ0IikgJT4lDQogIHNlbGVjdChsZXZlbCwgdmVydGVicmFsX251bWJlciwgeCwgeSkgJT4lDQogIG11dGF0ZSh1cHBlcl9sZXZlbF9udW1iZXIgPSBhcy5kb3VibGUodXBwZXJfcm9kX2xldmVsKSwNCiAgICAgICAgIGxvd2VyX2xldmVsX251bWJlciA9IGFzLmRvdWJsZShsb3dlcl9yb2RfbGV2ZWwpKSAlPiUNCiAgZmlsdGVyKGJldHdlZW4odmVydGVicmFsX251bWJlciwgdXBwZXJfbGV2ZWxfbnVtYmVyLCBsb3dlcl9sZXZlbF9udW1iZXIpKSAlPiUNCiAgc2VsZWN0KHgsIHkpICU+JQ0KICBhcnJhbmdlKHkpDQoNCmltcGxhbnRfc3RhcnRzX2RmICU+JQ0KICAgICAgICAgICAgc2VsZWN0KGxldmVsLCB2ZXJ0ZWJyYWxfbnVtYmVyKSAlPiUNCiAgICAgICAgICAgIGRpc3RpbmN0KCkgJT4lDQogICAgICAgICAgICBhcnJhbmdlKHZlcnRlYnJhbF9udW1iZXIpIA0KDQp2ZXJ0ZWJyYWxfbnVtYmVyX2RmJGxldmVsDQoNCnZlcnRlYnJhbF9udW1iZXJfZGYkbGV2ZWxbYygxLCBsZW5ndGgodmVydGVicmFsX251bWJlcl9kZiRsZXZlbCkpXQ0KDQpjKHZlcnRlYnJhbF9udW1iZXJfZGYkbGV2ZWxbMV0sIHRhaWwodmVydGVicmFsX251bWJlcl9kZiRsZXZlbCwgbiA9IDEpKQ0KDQppcy5maW5pdGUoYXNkZmFzKQ0KDQppcy5uYShkc2MpDQoNCnVuaXF1ZSh2ZXJ0ZWJyYWxfbnVtYmVyX2RmJGxldmVsKVsxXQ0KDQppbXBsYW50X3N0YXJ0c19kZg0KDQpidWlsZF9yb2RfZnVuY3Rpb24gPC0gZnVuY3Rpb24ocmFuZ2UsIHNpZGUsIGFkZF9tZWRpYWxfb3JfbGF0ZXJhbCA9ICJtZWRpYWwiLCBmdWxsX3JhbmdlX3Bvc3NpYmxlX2RmLCB4X29mZnNldCA9IDAuMDAzKXsNCiAgdXBwZXJfbGV2ZWwgPC0gcmFuZ2VbMV0NCiAgbG93ZXJfbGV2ZWwgPC0gcmFuZ2VbMl0NCiAgDQogIGlmKHNpZGUgPT0gImxlZnQiKXsNCiAgICB4X21vZGlmaWVyIDwtIGlmX2Vsc2UoYWRkX21lZGlhbF9vcl9sYXRlcmFsID09ICJtZWRpYWwiLCB4X29mZnNldCwgLXhfb2Zmc2V0KQ0KICB9ZWxzZXsNCiAgICB4X21vZGlmaWVyIDwtIGlmX2Vsc2UoYWRkX21lZGlhbF9vcl9sYXRlcmFsID09ICJtZWRpYWwiLCAteF9vZmZzZXQsIHhfb2Zmc2V0KQ0KICB9DQogIA0KICBudW1iZXJfcmFuZ2VfZm9yX3JvZF9kZiA8LSBmdWxsX3JhbmdlX3Bvc3NpYmxlX2RmICU+JQ0KICAgIHNlbGVjdChsZXZlbCwgdmVydGVicmFsX251bWJlcikgJT4lDQogICAgbXV0YXRlKHVwcGVyX2xldmVsID0gdXBwZXJfbGV2ZWwsIGxvd2VyX2xldmVsID0gbG93ZXJfbGV2ZWwpICU+JQ0KICAgIGZpbHRlcihsZXZlbCA9PSB1cHBlcl9sZXZlbCB8IGxldmVsID09IGxvd2VyX2xldmVsKSAlPiUNCiAgICBkaXN0aW5jdCgpICU+JQ0KICAgIHNlbGVjdCh2ZXJ0ZWJyYWxfbnVtYmVyKQ0KICANCiAgcm9kX21hdHJpeCA8LSBmdWxsX3JhbmdlX3Bvc3NpYmxlX2RmICU+JQ0KICAgIGZpbHRlcihiZXR3ZWVuKHZlcnRlYnJhbF9udW1iZXIsIG51bWJlcl9yYW5nZV9mb3Jfcm9kX2RmJHZlcnRlYnJhbF9udW1iZXJbMV0sIG51bWJlcl9yYW5nZV9mb3Jfcm9kX2RmJHZlcnRlYnJhbF9udW1iZXJbMl0pKSAlPiUNCiAgICBzZWxlY3QoeCwgeSkgJT4lDQogICAgYXJyYW5nZSh5KSAlPiUNCiAgICBkaXN0aW5jdCgpICU+JQ0KICAgIG11dGF0ZSh4ID0geCArIHhfbW9kaWZpZXIpICU+JQ0KICAgIGFzLm1hdHJpeCgpDQogIA0KICByb2Rfc2YgPC0gc3RfYnVmZmVyKHN0X2xpbmVzdHJpbmcocm9kX21hdHJpeCksIGRpc3QgPSAwLjAwMywgZW5kQ2FwU3R5bGUgPSAiUk9VTkQiKQ0KICANCn0NCg0Kcm9kX3ggPC0gYnVpbGRfcm9kX2Z1bmN0aW9uKHJhbmdlID0gYygiVDEwIiwgIkw0IiksIHNpZGUgPSAibGVmdCIsIGFkZF9tZWRpYWxfb3JfbGF0ZXJhbCA9ICJtZWRpYWwiLCBmdWxsX3JhbmdlX3Bvc3NpYmxlX2RmID0gaW1wbGFudF9zdGFydHNfZGYgJT4lIGZpbHRlcihzaWRlID09ICJsZWZ0IikpDQoNCmdncGxvdCgpICsgDQogIGdlb21fc2YoZGF0YSA9ICByb2RfeCkNCg0KcmFuZ2UgPC0gYygiVDEwIiwgIkw0IikNCg0KcmFuZ2VbMV0NCg0Kc3VtbWFyeShyb2RfeSlbMV0NCg0KbGVuZ3RoKHJvZF94KQ0KDQpzYXRfcm9kc19sZXZlbF9yYW5nZV9kZiA8LSB0aWJibGUobGV2ZWwgPSByYW5nZSkgJT4lDQogIGxlZnRfam9pbihpbXBsYW50X3N0YXJ0c19kZikgJT4lDQogIGZpbHRlcihpbXBsYW50ID09ICJwZWRpY2xlX3NjcmV3Iiwgc2lkZSA9PSAibGVmdCIpICU+JQ0KICBzZWxlY3QodmVydGVicmFsX251bWJlcikNCg0Kc2F0X3JvZHNfbGV2ZWxzX2RmIDwtIGltcGxhbnRfc3RhcnRzX2RmICU+JQ0KICBmaWx0ZXIoYmV0d2Vlbih2ZXJ0ZWJyYWxfbnVtYmVyLCBtaW4oc2F0X3JvZHNfbGV2ZWxfcmFuZ2VfZGYkdmVydGVicmFsX251bWJlciksIG1heChzYXRfcm9kc19sZXZlbF9yYW5nZV9kZiR2ZXJ0ZWJyYWxfbnVtYmVyKSkpICU+JQ0KICBmaWx0ZXIoaW1wbGFudCA9PSAicGVkaWNsZV9zY3JldyIsIHNpZGUgPT0gImxlZnQiKQ0KDQptYWluX3JvZF9sZXZlbHMgPC0gaW1wbGFudF9zdGFydHNfZGYgJT4lDQogIGZpbHRlcihpbXBsYW50ID09ICJwZWRpY2xlX3NjcmV3Iiwgc2lkZSA9PSAibGVmdCIpICU+JQ0KICBhbnRpX2pvaW4oc2F0X3JvZHNfbGV2ZWxzX2RmKQ0KDQpyX3ZlY3RvciA8LSBjKCJDMiIsICJDMyIpDQoNCnJhbmdlX3RvX2ZpbHRlcl9vdXRfdGVzdF9kZiA8LSB0aWJibGUobGV2ZWwgPSBjKCJDMiIsICJDMyIpKQ0KDQpzdHJfdG9fbG93ZXIoc3RyaW5nID0gcl92ZWN0b3IpDQoNCmltcGxhbnRfc3RhcnRzX2RmICU+JQ0KICBhbnRpX2pvaW4ocmFuZ2VfdG9fZmlsdGVyX291dF90ZXN0X2RmKQ0KDQp0YWJ5bChpbXBsYW50X3N0YXJ0c19kZiRpbXBsYW50KQ0KDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9OX0NCmdnZHJhdygpICsNCiAgICAgIGRyYXdfaW1hZ2Uoc3BpbmVfcG5nLCBzY2FsZSA9IDIsIHkgPSAwLCB2YWxpZ24gPSAwLCB4ID0gMCwgd2lkdGggPSAxLCBpbnRlcnBvbGF0ZSA9IFRSVUUpICsNCiAgICAgIGRyYXdfdGV4dCh0ZXh0ID0gbGFiZWxzX2RmJGxhYmVscywgeCA9IGxhYmVsc19kZiR4X2xlZnQsIHkgPSBsYWJlbHNfZGYkeSwgc2l6ZSA9IDEyLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICAgICAgZHJhd190ZXh0KHRleHQgPSBsYWJlbHNfZGYkbGFiZWxzLCB4ID0gbGFiZWxzX2RmJHhfcmlnaHQsIHkgPSBsYWJlbHNfZGYkeSwgc2l6ZSA9IDEyLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICAgICAgZ2VvbV9wb2ludChhZXMoeCA9IDAuNSAtIGlsaWFjX3hfb2Zmc2V0LCB5ID0gaWxpYWNfeSksIHNpemUgPSA0KSArIA0KICBnZW9tX3BvaW50KGFlcyh4ID0gMC41IC0gczJhaV94X29mZnNldCwgeSA9IHMyYWlfeSksIHNpemUgPSA0KSArIA0KICAjIGdlb21fc2YoZGF0YSA9IGwyX3VwZ29pbmdfaG9va3NfY29sbGVjdGlvbikgKw0KICAjIGdncGF0dGVybjo6Z2VvbV9zZl9wYXR0ZXJuKGRhdGEgPSBzMmFpX3NjcmV3X3NjcmV3aGVhZCRsZWZ0X3NjcmV3X3NmLCBwYXR0ZXJuID0gInN0cmlwZSIsICBwYXR0ZXJuX2ZpbGwgPSAicmVkIixhbHBoYSA9IDAuOCwgcGF0dGVybl9jb2xvdXIgPSAiYmx1ZSIsIHBhdHRlcm5fZGVuc2l0eSA9IDAuMDEsIHBhdHRlcm5fc3BhY2luZyA9IDAuMDAzLCBhbmdsZSA9IDcwKSArDQogICMgZ2dwYXR0ZXJuOjpnZW9tX3NmX3BhdHRlcm4oZGF0YSA9IHMyYWlfc2NyZXdfc2NyZXdoZWFkJHJpZ2h0X3NjcmV3X3NmLCBwYXR0ZXJuID0gInN0cmlwZSIsICBwYXR0ZXJuX2ZpbGwgPSAicmVkIixhbHBoYSA9IDAuOCwgcGF0dGVybl9jb2xvdXIgPSAiYmx1ZSIsIHBhdHRlcm5fZGVuc2l0eSA9IDAuMDEsIHBhdHRlcm5fc3BhY2luZyA9IDAuMDAzLCBhbmdsZSA9IDcwKSArDQogIHRoZW1lX21pbmltYWxfZ3JpZCgpICArDQogIHlsaW0oMCwgMC41KQ0KDQpwbG90IDwtIGdnZHJhdygpICsNCiAgZHJhd19pbWFnZShpbWFnZSA9IHNwaW5lX3BuZywgeCA9IDAsIHkgPSAwLCB3aWR0aCA9IDEsIHZhbGlnbiA9IDAsIGNsaXAgPSAib2ZmIiwgIGludGVycG9sYXRlID0gRkFMU0UpICsgDQogIGdlb21fc2YoZGF0YSA9IGRlY29tcHJlc3Npb25fbGV2ZWxzX3NmKQ0KDQpwbG90DQoNCmxhbWluZWN0b215X3BvaW50c19kZiA8LSByZWFkX2NzdigiY29vcmRpbmF0ZXNfbGFtaW5lY3RvbXkuY3N2IikNCg0KbGFtaW5lY3RvbXlfcG9pbnRzX2RmDQoNCmdnZHJhdyhwbG90LCBjbGlwID0gIm9uIikgKyANCiAgeWxpbSgwLjEsIDAuNSkNCg0KaW1wbGFudF9zdGFydHNfZGYgJT4lDQogICMgc2VsZWN0KGxldmVsLCB2ZXJ0ZWJyYWxfbnVtYmVyKSAlPiUNCiAgYXJyYW5nZSh2ZXJ0ZWJyYWxfbnVtYmVyKSAlPiUNCiAgIyBkaXN0aW5jdCgpICU+JQ0KICBtdXRhdGUobGV2ZWwgPSBmY3RfaW5vcmRlcihsZXZlbCkpDQoNCnNwaW5lX2xldmVscw0KDQppbXBsYW50X3N0YXJ0c19kZg0KDQp0ZXN0IDwtIHRpYmJsZShsZXZlbCA9IGMoIkMzIiwgIkM1IiksIHNpZGUgPSAibGVmdCIpDQoNCnRlc3QgJT4lDQogIGxlZnRfam9pbihpbXBsYW50X3N0YXJ0c19kZikNCg0KaW1wbGFudF9zdGFydHNfZGYgJT4lDQogIG11dGF0ZShsZXZlbF9zaWRlID0gcGFzdGUobGV2ZWwsIHNpZGUsIGltcGxhbnQsIHNlcCA9ICJfIikpICU+JQ0KICBzZWxlY3QobGV2ZWwsIGxldmVsX3NpZGUsIHNpZGUpICU+JQ0KICBmaWx0ZXIobGV2ZWxfc2lkZSAlaW4lIGMoIkwxX3JpZ2h0X3BlZGljbGVfc2NyZXciLCAiTDNfcmlnaHRfcGVkaWNsZV9zY3JldyIsICJMMV9sZWZ0X3BlZGljbGVfc2NyZXciLCAiTDJfbGVmdF9wZWRpY2xlX3NjcmV3IiwgIkw1X3JpZ2h0X3BlZGljbGVfc2NyZXciKSkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzaWRlLCB2YWx1ZXNfZnJvbSA9IGxldmVsX3NpZGUpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KaW1wbGFudHNfd2lkZV9kZiA8LSBpbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgbXV0YXRlKGxldmVsX3NpZGUgPSBwYXN0ZShsZXZlbCwgc2lkZSwgaW1wbGFudCwgc2VwID0gIl8iKSkgJT4lDQogIHNlbGVjdChsZXZlbCwgbGV2ZWxfc2lkZSwgc2lkZSkgJT4lDQogIGZpbHRlcihsZXZlbF9zaWRlICVpbiUgYygiTDFfcmlnaHRfcGVkaWNsZV9zY3JldyIsICJMM19yaWdodF9wZWRpY2xlX3NjcmV3IiwgIkwxX2xlZnRfcGVkaWNsZV9zY3JldyIsICJMMl9sZWZ0X3BlZGljbGVfc2NyZXciLCAiTDVfcmlnaHRfcGVkaWNsZV9zY3JldyIpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNpZGUsIHZhbHVlc19mcm9tID0gbGV2ZWxfc2lkZSkNCmltcGxhbnRzX3dpZGVfZGYNCg0KZGZfbmFtZXMgPC0gZ2x1ZV9jb2xsYXBzZShuYW1lcyhpbXBsYW50c193aWRlX2RmKSwgc2VwID0gIiAiKQ0KDQpkZl9uYW1lcw0KDQpsZXZlbF92ZWN0b3IgPC0gaW1wbGFudHNfd2lkZV9kZiRsZXZlbA0KDQpsZXZlbF92ZWN0b3INCg0KIyMgdGhlIGRhdGEgZnJhbWUgY2FuJ3QgaGF2ZSBhbnkgbWlzc2luZyB2YWx1ZXMsIG90aGVyd2lzZSB0aGUgdmVjdG9ycyB3aWxsIGJlIG9mIGRpZmZlcmVudCBsZW5ndGhzIHdoZW4geW91IHJ1biBtYXAoKQ0KaWYoc3RyX2RldGVjdChzdHJpbmcgPSBkZl9uYW1lcywgcGF0dGVybiA9ICJsZWZ0Iikpew0KICBpbXBsYW50c193aWRlX2RmIDwtIGltcGxhbnRzX3dpZGVfZGYgJT4lDQogICAgbXV0YXRlKGxlZnQgPSBpZl9lbHNlKGlzLm5hKGxlZnQpLCAibm9fc2NyZXciLCBsZWZ0KSkNCiAgDQogIGxlZnRfdmVjdG9yIDwtIGltcGxhbnRzX3dpZGVfZGYkbGVmdA0KfWVsc2V7DQogIGxlZnRfdmVjdG9yIDwtIGltcGxhbnRzX3dpZGVfZGYkbm9fc2NyZXdfdmVjdG9yDQp9DQoNCmlmKHN0cl9kZXRlY3Qoc3RyaW5nID0gZGZfbmFtZXMsIHBhdHRlcm4gPSAicmlnaHQiKSl7DQogIGltcGxhbnRzX3dpZGVfZGYgPC0gaW1wbGFudHNfd2lkZV9kZiAlPiUNCiAgICBtdXRhdGUocmlnaHQgPSBpZl9lbHNlKGlzLm5hKHJpZ2h0KSwgIm5vX3NjcmV3IiwgcmlnaHQpKQ0KICANCiAgcmlnaHRfdmVjdG9yIDwtIGltcGxhbnRzX3dpZGVfZGYkcmlnaHQNCn1lbHNlew0KICByaWdodF92ZWN0b3IgPC0gaW1wbGFudHNfd2lkZV9kZiRub19zY3Jld192ZWN0b3INCn0NCg0KbWF4X2xldmVscyA8LSBucm93KGltcGxhbnRzX3dpZGVfZGYpICAgICANCmxldmVsc19jb3VudCA8LSBzZXEoZnJvbSA9IDEsIHRvID0gbWF4X2xldmVscywgYnkgPSAxKQ0KDQpsZWZ0X3ZlY3Rvcg0KcmlnaHRfdmVjdG9yDQpgYGANCg0KDQoNCg0KYGBge3J9DQpidWlsZF9sYW1pbmVjdG9teV9mdW5jdGlvbiA8LSBmdW5jdGlvbihzdGFydF94ID0gMC41LCB3aWR0aCwgc3VwZXJpb3JfeSwgaW5mZXJpb3JfeSl7DQogIGxlZnRfaW5mZXJpb3JfeCA8LSBzdGFydF94IC0gMC41KndpZHRoDQogIGxlZnRfc3VwZXJpb3JfeCA8LSBzdGFydF94IC0gMC40KndpZHRoDQogIHJpZ2h0X2luZmVyaW9yX3ggPC0gc3RhcnRfeCArIDAuNSp3aWR0aA0KICByaWdodF9zdXBlcmlvcl94IDwtIHN0YXJ0X3ggKyAwLjQqd2lkdGgNCiAgDQogIGxhbWluZWN0b215IDwtIHN0X2J1ZmZlcihzdF9wb2x5Z29uKGxpc3QocmJpbmQoYyhsZWZ0X2luZmVyaW9yX3gsIGluZmVyaW9yX3kpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMobGVmdF9zdXBlcmlvcl94LCBzdXBlcmlvcl95KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKHJpZ2h0X3N1cGVyaW9yX3gsIHN1cGVyaW9yX3kpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMocmlnaHRfaW5mZXJpb3JfeCwgaW5mZXJpb3JfeSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhsZWZ0X2luZmVyaW9yX3gsIGluZmVyaW9yX3kpDQogICAgDQogICkpKSwgZGlzdCA9IDAuMDA0LCBlbmRDYXBTdHlsZSA9ICJTUVVBUkUiKQ0KICAjIGxhbWluZWN0b215DQogIHN0X2J1ZmZlcihsYW1pbmVjdG9teSwgZGlzdCA9IC0wLjAwMywgZW5kQ2FwU3R5bGUgPSAiU1FVQVJFIikNCn0NCg0KbGFtaW5lY3RvbXlfY29uc3RydWN0ZWRfZGYgPC0gbGFtaW5lY3RvbXlfcG9pbnRzX2RmICU+JQ0KICBtdXRhdGUoZGVjb21wcmVzc2lvbl9jb25zdHJ1Y3RlZCA9IHBtYXAobGlzdCguLjEgPSB3aWR0aCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uMiA9IHN1cGVyaW9yX3ksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uMyA9IGluZmVyaW9yX3kpLCAuZiA9IH5idWlsZF9sYW1pbmVjdG9teV9mdW5jdGlvbihzdGFydF94ID0gMC41LCB3aWR0aCA9IC4uMSwgc3VwZXJpb3JfeSA9IC4uMiwgaW5mZXJpb3JfeSA9IC4uMykpKQ0KDQoNCmRlY29tcHJlc3Npb25fbGV2ZWxzX3NmIDwtIHN0X211bHRpcG9seWdvbihsYW1pbmVjdG9teV9jb25zdHJ1Y3RlZF9kZiRkZWNvbXByZXNzaW9uX2NvbnN0cnVjdGVkKQ0KDQogZ2dkcmF3KCkgKw0KICBkcmF3X2ltYWdlKGltYWdlID0gc3BpbmVfcG5nLCB4ID0gMCwgeSA9IDAsIHdpZHRoID0gMSwgdmFsaWduID0gMCwgY2xpcCA9ICJvZmYiKSArIA0KICAgICAgICAgICAgICAgICAgIGdncGF0dGVybjo6Z2VvbV9zZl9wYXR0ZXJuKA0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGVjb21wcmVzc2lvbl9sZXZlbHNfc2YsDQogICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAic3RyaXBlIiwNCiAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9maWxsID0gImdyZXkiLA0KICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuOCwNCiAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9jb2xvdXIgPSAicmVkIiwNCiAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9kZW5zaXR5ID0gMC4wMiwNCiAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9zcGFjaW5nID0gMC4xDQogICAgICAgICAgICAgICAgICAgKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQppbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgZmlsdGVyKGltcGxhbnQgPT0gInRldGhlciIsIGxldmVsICVpbiUgYygiTDQiLCAiVDEwIiwgIlQ0IiwgIlQ2IikpDQoNCnRldGhlcnNfZGYgPC0gaW1wbGFudF9zdGFydHNfZGYgJT4lDQogIGZpbHRlcihpbXBsYW50ID09ICJ0ZXRoZXIiKSAlPiUNCiAgbXV0YXRlKHRldGhlcl9pbXBsYW50cyA9IG1hcDIoLnggPSB5LCAueSA9IGxlbmd0aCwgLmYgPSB+dGV0aGVyX2Z1bmN0aW9uKHRldGhlcl9zdGFydF95ID0gLngsIHRldGhlcl9sZW5ndGggPSAueSkpKQ0KDQp0NF90ZXRoZXIgPC0gdGV0aGVyX2Z1bmN0aW9uKHRldGhlcl9zdGFydF95ID0gMC42NzEsIHRldGhlcl9sZW5ndGggPSAwLjAyOSkNCg0KdDZfdGV0aGVyIDwtIHRldGhlcl9mdW5jdGlvbih0ZXRoZXJfc3RhcnRfeSA9IDAuNjEwLCB0ZXRoZXJfbGVuZ3RoID0gMC4wMzIpDQoNCmw0X3RldGhlciA8LSB0ZXRoZXJfZnVuY3Rpb24odGV0aGVyX3N0YXJ0X3kgPSAwLjI2LCB0ZXRoZXJfbGVuZ3RoID0gMC4wMzYpDQoNCnQxMF90ZXRoZXIgPC0gdGV0aGVyX2Z1bmN0aW9uKHRldGhlcl9zdGFydF95ID0gMC40OCwgdGV0aGVyX2xlbmd0aCA9IDAuMDM1KQ0KDQp0ZXRoZXJzX3NmIDwtIHN0X211bHRpbGluZXN0cmluZygpDQoNCg0Kc3VtbWFyeSh0ZXRoZXJzX2RmJHRldGhlcl9pbXBsYW50cykNCnRldGhlcnNfc2YgPC0gc3RfbXVsdGlwb2x5Z29uKHRldGhlcnNfZGYkdGV0aGVyX2ltcGxhbnRzKQ0KDQogZ2dkcmF3KCkgKw0KICBkcmF3X2ltYWdlKGltYWdlID0gc3BpbmVfcG5nLCB4ID0gMCwgeSA9IDAsIHdpZHRoID0gMSwgdmFsaWduID0gMCwgY2xpcCA9ICJvbiIpICsgDQogICAgICAgICAgICAgICAgICAgIyBnZ3BhdHRlcm46Omdlb21fc2ZfcGF0dGVybigNCiAgICAgICAgICAgICAgICAgICAjICBkYXRhID0gZGVjb21wcmVzc2lvbl9sZXZlbHNfc2YsDQogICAgICAgICAgICAgICAgICAgIyAgcGF0dGVybiA9ICJzdHJpcGUiLA0KICAgICAgICAgICAgICAgICAgICMgIHBhdHRlcm5fZmlsbCA9ICJncmV5IiwNCiAgICAgICAgICAgICAgICAgICAjICBhbHBoYSA9IDAuOCwNCiAgICAgICAgICAgICAgICAgICAjICBwYXR0ZXJuX2NvbG91ciA9ICJyZWQiLA0KICAgICAgICAgICAgICAgICAgICMgIHBhdHRlcm5fZGVuc2l0eSA9IDAuMDIsDQogICAgICAgICAgICAgICAgICAgIyAgcGF0dGVybl9zcGFjaW5nID0gMC4xDQogICAgICAgICAgICAgICAgICAgIyApDQogICBnZW9tX3NmKGRhdGEgPSB0ZXRoZXJzX3NmKQ0KIA0KIHRldGhlcnNfd2lyZXNfZGYgPC0gdGliYmxlKGltcGxhbnQgPSBjaGFyYWN0ZXIoKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBjaGFyYWN0ZXIoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZWJyYWxfbnVtYmVyID0gbnVtZXJpYygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBudW1lcmljKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG51bWVyaWMoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IG51bWVyaWMoKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCnRldGhlcnNfd2lyZXNfZGYNCg0KYGBgDQpgYGB7cn0NCiNwZWRpY2xlIGhvb2tzDQppbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgZmlsdGVyKGltcGxhbnQgPT0gInBlZGljbGVfc2NyZXciKQ0KDQpidWlsZF9wZWRpY2xlX2hvb2tfZnVuY3Rpb24gPC0gZnVuY3Rpb24oeF9zdGFydCwgeV9zdGFydCl7DQogIA0KICB5X2xlbnRoIDwtIDAuMDENCiAgDQogIHhfd2lkdGggPC0gMC4wMTINCiAgDQogIGlmKHhfc3RhcnQgPCAwLjUpew0KICAgIHN0YXJ0IDwtIGMoeF9zdGFydCwgeV9zdGFydCkNCiAgICANCiAgICBwb2ludF8yIDwtIGMoc3RhcnRbMV0sIHN0YXJ0WzJdIC0geV9sZW50aCkNCiAgICANCiAgICBwb2ludF8zIDwtIGMoc3RhcnRbMV0gKyB4X3dpZHRoKjAuNSwgc3RhcnRbMl0gLSB5X2xlbnRoKQ0KICAgIA0KICAgIHBvaW50XzQgPC0gYyhwb2ludF8zWzFdLCBwb2ludF8zWzJdICsgeV9sZW50aCowLjc1KQ0KICAgIA0KICAgIHBvaW50XzUgPC0gcG9pbnRfMw0KICAgIA0KICAgIHBvaW50XzYgPC0gYyhwb2ludF8yWzFdICsgeF93aWR0aCwgcG9pbnRfMlsyXSkNCiAgICANCiAgICBwb2ludF83IDwtIGMocG9pbnRfNlsxXSwgcG9pbnRfNlsyXSArIHlfbGVudGgqMC43NSkNCiAgICANCiAgICBob29rIDwtIHN0X2xpbmVzdHJpbmcocmJpbmQoc3RhcnQsIHBvaW50XzMsIHBvaW50XzQsIHBvaW50XzUsIHBvaW50XzYsIHBvaW50XzcpKQ0KICAgIA0KICAgIGhvb2tfc2YgPC0gc3RfYnVmZmVyKGhvb2ssIGRpc3QgPSAwLjAwMiwgZW5kQ2FwU3R5bGUgPSAiUk9VTkQiKQ0KICB9DQogIA0KICAgIGlmKHhfc3RhcnQgPiAwLjUpew0KICAgIHN0YXJ0IDwtIGMoeF9zdGFydCwgeV9zdGFydCkNCiAgICANCiAgICBwb2ludF8yIDwtIGMoc3RhcnRbMV0sIHN0YXJ0WzJdIC0geV9sZW50aCkNCiAgICANCiAgICBwb2ludF8zIDwtIGMoc3RhcnRbMV0gLSB4X3dpZHRoKjAuNSwgc3RhcnRbMl0gLSB5X2xlbnRoKQ0KICAgIA0KICAgIHBvaW50XzQgPC0gYyhwb2ludF8zWzFdLCBwb2ludF8zWzJdICsgeV9sZW50aCowLjc1KQ0KICAgIA0KICAgIHBvaW50XzUgPC0gcG9pbnRfMw0KICAgIA0KICAgIHBvaW50XzYgPC0gYyhwb2ludF8yWzFdIC0geF93aWR0aCwgcG9pbnRfMlsyXSkNCiAgICANCiAgICBwb2ludF83IDwtIGMocG9pbnRfNlsxXSwgcG9pbnRfNlsyXSArIHlfbGVudGgqMC43NSkNCiAgICANCiAgICBob29rIDwtIHN0X2xpbmVzdHJpbmcocmJpbmQoc3RhcnQsIHBvaW50XzMsIHBvaW50XzQsIHBvaW50XzUsIHBvaW50XzYsIHBvaW50XzcpKQ0KICAgIA0KICAgIGhvb2tfc2YgPC0gc3RfYnVmZmVyKGhvb2ssIGRpc3QgPSAwLjAwMiwgZW5kQ2FwU3R5bGUgPSAiUk9VTkQiKQ0KICAgIH0NCiAgDQogIHJldHVybihob29rX3NmKQ0KDQp9DQoNCmltcGxhbnRfc3RhcnRzX2RmICU+JQ0KICBmaWx0ZXIoaW1wbGFudCA9PSAicGVkaWNsZV9ob29rIikNCg0KcGVkaWNsZV9ob29rX2RmIDwtIGltcGxhbnRfc3RhcnRzX2RmICU+JQ0KICBmaWx0ZXIoaW1wbGFudCA9PSAicGVkaWNsZV9ob29rIikgJT4lDQogIG11dGF0ZShob29rID0gcG1hcChsaXN0KC4uMSA9IHgsDQogICAgICAgICAgICAgICAgICAgICAgICAgIC4uMiA9IHkpLCAuZiA9IH5idWlsZF9wZWRpY2xlX2hvb2tfZnVuY3Rpb24oeF9zdGFydCA9IC4uMSwgeV9zdGFydCA9IC4uMikpKQ0KDQojIG9zdGVvdG9taWVzX3NmIDwtIHN0X211bHRpbGluZXN0cmluZyhvc3Rlb3RvbXlfZGYkZ3JhZGVfMSkNCg0KaG9va19zZiA8LSBzdF9tdWx0aXBvbHlnb24ocGVkaWNsZV9ob29rX2RmJGhvb2spDQoNCiBnZ2RyYXcoKSArDQogIGRyYXdfaW1hZ2UoaW1hZ2UgPSBzcGluZV9wbmcsIHggPSAwLCB5ID0gMCwgd2lkdGggPSAxLCB2YWxpZ24gPSAwLCBjbGlwID0gIm9uIikgKyANCiAgIGdlb21fc2YoZGF0YSA9IGhvb2tfc2YsIGNvbG9yID0gInJlZCIpDQpgYGANCmBgYHtyfQ0KaW1wbGFudF9zdGFydHNfZGYgJT4lDQogIGZpbHRlcihpbXBsYW50ID09ICJzdWJsYW1pbmFyX3dpcmUiKQ0KYGBgDQoNCg0KYGBge3J9DQojc3VibGFtaW5hciBiYW5kcw0KDQppbXBsYW50X3N0YXJ0c19kZiAlPiUNCiAgZmlsdGVyKGltcGxhbnQgPT0gInN1YmxhbWluYXJfd2lyZSIpDQoNCmNvbiA8LSBzdF9saW5lc3RyaW5nKHJiaW5kKGMoMC41MTUsIDAuODgpLCBjKDAuNTA1LCAwLjg5KSwgYygwLjUxNSwgMC44OCksIGMoMC41MDUsIDAuODcpKSkNCg0Kc3ViIDwtIHN0X2xpbmVzdHJpbmcocmJpbmQoYygwLjUwLCAwLjg5KSwgYygwLjUwLCAwLjg3KSkpDQoNCmNvbl9iIDwtIHN0X2J1ZmZlcihjb24sIGRpc3QgPSAuMDAyKQ0KDQpzdWJfYiA8LSBzdF9idWZmZXIoc3ViLCBkaXN0ID0gMC4wMDEpDQoNCg0KY29uX3N1YiA8LSBzdF9wb2x5Z29uKHN0X3VuaW9uKHggPWNvbl9iLCB5ID0gc3ViX2IpKQ0KDQpzdWJsYW1pbmFyX2JhbmRfZGYgPC0gaW1wbGFudF9zdGFydHNfZGYgJT4lDQogIGZpbHRlcihpbXBsYW50ID09ICJzdWJsYW1pbmFyX3dpcmUiKSAlPiUNCiAgZmlsdGVyKGxldmVsID09ICJUMTAiICkgICU+JQ0KICBtdXRhdGUoc3ViX2JhbmQgPSBwbWFwKGxpc3QoLi4xID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjIgPSB5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uMyA9IGxlbmd0aCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjQgPSBpbXBsYW50KSwgLmYgPSB+IHNjcmV3X2hvb2tfaW1wbGFudF9mdW5jdGlvbihpbXBsYW50X3R5cGUgPSAuLjQsIHN0YXJ0X3ggPSAuLjEsIHkgPSAuLjIsIHN1YmxhbWluYXJfYmFuZF9sZW5ndGggPSAuLjMpKSkNCg0KDQojIG9zdGVvdG9taWVzX3NmIDwtIHN0X211bHRpbGluZXN0cmluZyhvc3Rlb3RvbXlfZGYkZ3JhZGVfMSkNCnN1YmxhbWluYXJfYmFuZF9kZg0Kc3VibGFtaW5hcl9iYW5kX3NmIDwtIHN0X211bHRpcG9seWdvbihzdWJsYW1pbmFyX2JhbmRfZGYkc3ViX2JhbmQpDQpzdWJsYW1pbmFyX2JhbmRfc2YNCg0Kc3VtbWFyeShzdWJsYW1pbmFyX2JhbmRfZGYkc3VibGFtaW5hcl9iYW5kWzFdKQ0KDQogZ2dkcmF3KCkgKw0KICBkcmF3X2ltYWdlKGltYWdlID0gc3BpbmVfcG5nLCB4ID0gMCwgeSA9IDAsIHdpZHRoID0gMSwgdmFsaWduID0gMCwgY2xpcCA9ICJvbiIpICsgDQogICAjIGdlb21fc2YoZGF0YSA9IHN1YmxhbWluYXJfYmFuZF9zZiwgY29sb3IgPSAicmVkIikgKw0KICAgIyBnZW9tX3NmKGRhdGEgPSBzdF91bmlvbih4ID1jb25fYiwgeSA9IHN1Yl9iKSkgKw0KICAgZ2VvbV9zZihkYXRhID0gc3VibGFtaW5hcl9iYW5kX3NmKSArDQogICAjIGdlb21fc2YoZGF0YSA9IHN1Yl9iKSArDQogICB5bGltKDAuMywgMC45KQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0Kc2Nod2FiX3BvaW50c19kZiA8LSByZWFkX2NzdihmaWxlID0gInNjaHdhYl8xX29zdGVvdG9teS5jc3YiKQ0KDQoNCnNjaHdhYl9wb2ludHNfZGYNCg0Kc2Nod2FiX3BvaW50c19kZiAlPiUNCiAgZmlsdGVyKGdyYWRlID09ICJHcmFkZSAxIikNCiMgZGVjb21wcmVzc2lvbnNfb3N0ZW90b21pZXNfbGlzdCRvc3Rlb3RvbWllcw0KDQoNCm9zdGVvdG9teV9kZiA8LSBzY2h3YWJfcG9pbnRzX2RmICU+JQ0KICBmaWx0ZXIoZ3JhZGUgPT0gIkdyYWRlIDEiKSAlPiUNCiAgbXV0YXRlKG9zdGVvdG9teV9jb25zdHJ1Y3RlZCA9IHBtYXAobGlzdCguLjEgPSBsZXZlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uMiA9IGdyYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjMgPSBsYXRlcmFsX3gsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uNCA9IHN1cGVyaW9yX3ksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uNSA9IG1lZGlhbF94LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjYgPSBpbmZlcmlvcl95KSwgLmYgPSB+YnVpbGRfb3N0ZW90b215X2Z1bmN0aW9uKGxldmVsID0gLi4xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdGVvdG9teV9ncmFkZSA9IC4uMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlcmFsX3ggPSAuLjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJpb3JfeSA9IC4uNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYWxfeCA9IC4uNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mZXJpb3JfeSA9IC4uNikpKQ0KIyBvc3Rfc2YgPC0gc3RfZ2VvbWV0cnljb2xsZWN0aW9uKG9zdGVvdG9teV9kZiRncmFkZV8zKQ0KDQpncmFkZV8xX2RmIDwtIG9zdGVvdG9teV9kZiAlPiUNCiAgZmlsdGVyKGdyYWRlID09ICJHcmFkZSAxIikNCg0KZ3JhZGVfMl9kZiA8LSBvc3Rlb3RvbXlfZGYgJT4lDQogIGZpbHRlcihncmFkZSA9PSAiR3JhZGUgMiIpDQoNCmdyYWRlXzJfZGYNCg0KZ3JhZGVfM19kZiA8LSBvc3Rlb3RvbXlfZGYgJT4lDQogIGZpbHRlcihncmFkZSA9PSAiR3JhZGUgMyIpDQoNCmdyYWRlXzFfc2YgPC0gc3RfbXVsdGlsaW5lc3RyaW5nKGdyYWRlXzFfZGYkb3N0ZW90b215X2NvbnN0cnVjdGVkKQ0KDQppZihucm93KGdyYWRlXzJfZGYpID4gMCl7DQogIGdyYWRlXzJfc2YgPC0gc3RfbXVsdGlwb2x5Z29uKGdyYWRlXzJfZGYkb3N0ZW90b215X2NvbnN0cnVjdGVkKQ0KfWVsc2V7DQogIGdyYWRlXzJfc2YgPC0gTlVMTA0KfQ0KDQpncmFkZV8yX3NmDQoNCmdyYWRlXzJfc2YgPC0gc3RfbXVsdGlwb2x5Z29uKGdyYWRlXzJfZGYkb3N0ZW90b215X2NvbnN0cnVjdGVkKQ0KDQpncmFkZV8zX3NmIDwtIHN0X211bHRpcG9seWdvbihncmFkZV8zX2RmJG9zdGVvdG9teV9jb25zdHJ1Y3RlZCkNCg0KZ3JhZGVfMl9zZiA8LSBOVUxMDQoNCiBnZ2RyYXcoKSArDQogIGRyYXdfaW1hZ2UoaW1hZ2UgPSBzcGluZV9wbmcsIHggPSAwLCB5ID0gMCwgd2lkdGggPSAxLCB2YWxpZ24gPSAwLCBjbGlwID0gIm9uIikgKyANCiAgICMgZ2VvbV9zZihkYXRhID0gb3N0ZW90b21pZXNfc2YsIGNvbG9yID0gInJlZCIpDQogICAgICAgICAgICBnZ3BhdHRlcm46Omdlb21fc2ZfcGF0dGVybigNCiAgICAgICAgICAgICAgICBkYXRhID0gZ3JhZGVfMl9zZiwgIyBsZWZ0X2ltcGxhbnRzX2NvbnN0cnVjdGVkX3JlYWN0aXZlX3NmKCksDQogICAgICAgICAgICAgICAgcGF0dGVybiA9ICJjcm9zc2hhdGNoIiwNCiAgICAgICAgICAgICAgICBhbHBoYSA9IDAuOCwNCiAgICAgICAgICAgICAgICBwYXR0ZXJuX2NvbG91ciA9ICJyZWQiLA0KICAgICAgICAgICAgICAgIHBhdHRlcm5fZmlsbCA9ICJibGFjayIsDQogICAgICAgICAgICAgICAgcGF0dGVybl9kZW5zaXR5ID0gMC4wMiwNCiAgICAgICAgICAgICAgICBwYXR0ZXJuX3NwYWNpbmcgPSAwLjAxLA0KICAgICAgICAgICAgICAgIHBhdHRlcm5fYW5nbGUgPSA3MA0KICAgICAgICAgICAgKQ0KIA0KIA0KIA0KIGltcGxhbnRfc3RhcnRzX2RmDQoNCmBgYA0KYGBge3J9DQphbGxfaW1wbGFudHNfY29uc3RydWN0ZWRfbWFpbl9yb2RfZGYgPC0gIGltcGxhbnRfc3RhcnRzX2RmICU+JQ0KICBmaWx0ZXIoaW1wbGFudCAhPSAidGV0aGVyIikgJT4lDQogIG11dGF0ZShyb2QgPSAic2F0ZWxsaXRlX3JvZCIpICU+JQ0KICBtdXRhdGUoc3VibGFtaW5hcl9iYW5kX2xlbmd0aCA9IGxlbmd0aCkgJT4lDQogICAgcmVwbGFjZV9uYShsaXN0KGxlbmd0aCA9IDAsIHdpZHRoID0gMCwgYW5nbGUgPSAwKSkgJT4lDQogIG11dGF0ZShpbXBsYW50X2NvbnN0cnVjdGVkID0gcG1hcCgubCA9ICBsaXN0KC4uMSA9IGltcGxhbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjIgPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4zID0geSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uNCA9IGFuZ2xlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjUgPSBsZW5ndGgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjYgPSB3aWR0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi43ID0gcm9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi44ID0gc3VibGFtaW5hcl9iYW5kX2xlbmd0aCksIC5mID0gfiBzY3Jld19ob29rX2ltcGxhbnRfZnVuY3Rpb24oaW1wbGFudF90eXBlID0gLi4xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9vcl9zYXR0ZWxpdGVfcm9kID0gLi43LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfeCA9IC4uMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IC4uMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAuLjQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmV3X2xlbmd0aF9tb2QgPSAuLjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmV3X3dpZHRoX21vZCA9IC4uNiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxhbWluYXJfYmFuZF9sZW5ndGggPSAuLjgpKSkNCg0KYWxsX2ltcGxhbnRzX2NvbnN0cnVjdGVkX3NhdGVsbGl0ZV9yb2RfZGYgPC0gIGltcGxhbnRfc3RhcnRzX2RmICU+JQ0KICBmaWx0ZXIoaW1wbGFudCAhPSAidGV0aGVyIikgJT4lDQogIG11dGF0ZShyb2QgPSAic2F0ZWxsaXRlX3JvZCIpICU+JQ0KICBtdXRhdGUoc3VibGFtaW5hcl9iYW5kX2xlbmd0aCA9IGxlbmd0aCkgJT4lDQogIHJlcGxhY2VfbmEobGlzdChsZW5ndGggPSAwLCB3aWR0aCA9IDAsIGFuZ2xlID0gMCkpICU+JQ0KICBtdXRhdGUoaW1wbGFudF9jb25zdHJ1Y3RlZCA9IHBtYXAoLmwgPSAgbGlzdCguLjEgPSBpbXBsYW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4yID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uMyA9IHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLjQgPSBhbmdsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi41ID0gbGVuZ3RoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi42ID0gd2lkdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uNyA9IHJvZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uOCA9IHN1YmxhbWluYXJfYmFuZF9sZW5ndGgpLCAuZiA9IH4gc2NyZXdfaG9va19pbXBsYW50X2Z1bmN0aW9uKGltcGxhbnRfdHlwZSA9IC4uMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fb3Jfc2F0dGVsaXRlX3JvZCA9IC4uNywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3ggPSAuLjIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAuLjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gLi40LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3Jld19sZW5ndGhfbW9kID0gLi41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3Jld193aWR0aF9tb2QgPSAuLjYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsYW1pbmFyX2JhbmRfbGVuZ3RoID0gLi44KSkpDQoNCg0KYWxsX2ltcGxhbnRzX2NvbnN0cnVjdGVkX2RmIDwtIGFsbF9pbXBsYW50c19jb25zdHJ1Y3RlZF9tYWluX3JvZF9kZiAlPiUNCiAgdW5pb25fYWxsKGFsbF9pbXBsYW50c19jb25zdHJ1Y3RlZF9zYXRlbGxpdGVfcm9kX2RmKQ0KDQphbGxfaW1wbGFudHNfY29uc3RydWN0ZWRfZGYNCmBgYA0KDQoNCg0KYGBge3J9DQoNCmFsbF9pbXBsYW50c19zZiA8LSBzdF9nZW9tZXRyeWNvbGxlY3Rpb24oYWxsX2ltcGxhbnRzX2NvbnN0cnVjdGVkX2RmJGltcGxhbnRfY29uc3RydWN0ZWQpDQoNCmFsbF9pbXBsYW50c19zZiA8LSBzdF9tdWx0aXBvbHlnb24oYWxsX2ltcGxhbnRzX2NvbnN0cnVjdGVkX2RmJGltcGxhbnRfY29uc3RydWN0ZWQpDQoNCg0KIGdnZHJhdygpICsNCiAgZHJhd19pbWFnZShpbWFnZSA9IHNwaW5lX3BuZywgeCA9IDAsIHkgPSAwLCB3aWR0aCA9IDEsIHZhbGlnbiA9IDAsIGNsaXAgPSAib24iKSArIA0KICAgZ2VvbV9zZihkYXRhID0gYWxsX2ltcGxhbnRzX3NmLCBjb2xvciA9ICJyZWQiKQ0KICAgICAgICAgICAgZ2dwYXR0ZXJuOjpnZW9tX3NmX3BhdHRlcm4oDQogICAgICAgICAgICAgICAgZGF0YSA9IGdyYWRlXzJfc2YsICMgbGVmdF9pbXBsYW50c19jb25zdHJ1Y3RlZF9yZWFjdGl2ZV9zZigpLA0KICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiY3Jvc3NoYXRjaCIsDQogICAgICAgICAgICAgICAgYWxwaGEgPSAwLjgsDQogICAgICAgICAgICAgICAgcGF0dGVybl9jb2xvdXIgPSAicmVkIiwNCiAgICAgICAgICAgICAgICBwYXR0ZXJuX2ZpbGwgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgIHBhdHRlcm5fZGVuc2l0eSA9IDAuMDIsDQogICAgICAgICAgICAgICAgcGF0dGVybl9zcGFjaW5nID0gMC4wMSwNCiAgICAgICAgICAgICAgICBwYXR0ZXJuX2FuZ2xlID0gNzANCiAgICAgICAgICAgICkNCg0KDQpgYGANCg0KDQoNCg0KYGBge3J9DQpsMV9kZl9yaWdodCA8LSByZWFkX2NzdihmaWxlID0gImwxX2JvZHkuY3N2IikNCg0KbDFfZGYgPC0gbDFfZGZfcmlnaHQgJT4lDQogIG11dGF0ZSh4ID0gMS14KSAlPiUNCiAgdW5pb25fYWxsKGwxX2RmX3JpZ2h0KSAlPiUNCiAgc2VsZWN0KGNvb3JkaW5hdGVfdHlwZSwgeCwgeSkgJT4lDQogIG11dGF0ZSh4ID0gcm91bmQoeCwgMiksIHkgPSByb3VuZCh5LCAyKSkNCg0KbDFfbWF0cml4IDwtIGwxX2RmJT4lDQogIGJpbmRfcm93cyhsMV9kZlsxLF0pICU+JQ0KICBzZWxlY3QoeCwgeSkgJT4lIGFzLm1hdHJpeCgpDQoNCmwxX21hdHJpeA0KDQoNCg0KbDFfbGluZTwtIHN0X211bHRpcG9pbnQoeCA9IGwxX21hdHJpeCApDQoNCmwxX2J1ZmZlcmVkIDwtIHN0X3VuaW9uKGwxX2xpbmUpDQoNCmwxX3NmIDwtIHN0X3BvbHlnb24obGlzdChsMV9idWZmZXJlZCkpDQoNCmwxX2J1ZmZlcmVkIDwtIHN0X2J1ZmZlcihzdF9ib3VuZGFyeShsMV9idWZmZXJlZCksIGRpc3QgPSAwLjAwNSwgZW5kQ2FwU3R5bGUgPSAiUk9VTkQiKQ0KDQpnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGRhdGEgPSBzdF9idWZmZXIobDFfc2YsIGRpc3QgPSAgMC4wMDUpKQ0KICBnZ3BhdHRlcm46Omdlb21fc2ZfcGF0dGVybihkYXRhID0gbDFfYnVmZmVyZWQsIHBhdHRlcm4gPSAicGxhc21hIiwgcGF0dGVybl9hbHBoYSA9IDEsIHBhdHRlcm5fc2NhbGUgPSAyLCBjb2xvciA9ICJibGFjayIpDQoNCmBgYA0KDQpgYGB7cn0NCnNwaW5lX3BuZyA8LSBpbWFnZV9yZWFkKHBhdGggPSAicG9zdGVyaW9yX3NwaW5lX2ZpZ3VyZS5wbmciKQ0KDQoNCmBgYA0KDQo=